吉大軟體專碩967-2012
阿新 • • 發佈:2018-11-01
#include<stdio.h> #define N 20 int main(){ int octal(int decimal); int decimal,oct; printf("Please input the Decimal number:"); scanf("%d",&decimal); printf("The Octal number is:"); oct = octal(decimal); printf("%d\n",oct); return 0; } int octal(int decimal){ int *octal = (int *)malloc(N * sizeof(int)); int Oct=0; int i,j; while(decimal>0){ octal[i] = decimal % 8; decimal = (decimal - octal[i]) / 8; i++; } for(j=0;j<i;j++) Oct += octal[j]* pow(10,j); return Oct; }
執行結果:
思路:
第一步,輸入並存於兩個陣列中(一個int型,一個double型故用兩個陣列,也可以double fraction[N][3],在第三位儲存分數的值)
第二步,以分數的值排序
第三部,化簡分子分母,分子分母同時除以最大公約數
#include<stdio.h> #define N 5 //輸入5個分數,按題要求應換為100 int main(){ int max_CommonDivisor(int x,int y); int **sort(int **fraction,double result[]); int i,j,sign,max_commonDivisor; int fraction[N][2];//第一位存分子,第二位存分母 double result[N];//result為fraction的小數,下標相對應 for(i=0;i<N;i++){ printf("請輸入第%d個分數的分子:",i+1); scanf("%d",&fraction[i][0]); printf("請輸入第%d個分數的分母:",i+1); scanf("%d",&fraction[i][1]); result[i] = (double)fraction[i][0]/(double)fraction[i][1]; printf("請輸入第%d個分數為:",i+1); printf("(%d,%d)\n",fraction[i][0],fraction[i][1]); } int **frac = sort((int **)fraction,result); printf("化簡+排序之後:--------------------------\n");//輸出 for(i=0;i<N;i++){ //max_commonDivisor = max_CommonDivisor(frac[i][0],frac[i][1]); max_commonDivisor = max_CommonDivisor( *((int *)frac+2*i), *((int *)frac+2*i+1)); *((int *)frac+2*i)=*((int *)frac+2*i) / max_commonDivisor; *((int *)frac+2*i+1)=*((int *)frac+2*i+1) / max_commonDivisor; printf("(%d,%d)\t",*((int *)frac+2*i),*((int *)frac+2*i+1)); } } int **sort(int **fraction,double result[N]){ int i,j,sign; //排序,每次遍歷找出最大的一個數,將其放入陣列末尾 int x,y; double max=0; for(i=N-1;i>0;i--){ max=result[0]; sign = 0; for(j=0;j<=i;j++) if(result[j]>max){ sign = j; max=result[j]; } // //交換陣列result的下標為sign與i的數 result[sign]= result[i]; result[i] = max; //交換陣列fraction的下標為sign與i的數 x = *((int *)fraction+2*sign); y = *((int *)fraction+2*sign+1); *((int *)fraction+2*sign) = *((int *)fraction+2*i); *((int *)fraction+2*sign+1) = *((int *)fraction+2*i+1); *((int *)fraction+2*i) = x; *((int *)fraction+2*i+1) = y; // x=fraction[sign][0];y=fraction[sign][1]; // fraction[sign][0] = fraction[i][0]; // fraction[sign][1] = fraction[i][1]; // fraction[i][0] = x; // fraction[i][1] = y; } return fraction; } /*求x,y的最大公約數*/ int max_CommonDivisor(int x,int y){ int max,min,t; if(x>y){ max = x; min = y; }else{ max = y; min = x; } while(max % min != 0){ t = min; min = max % min; max = t; } return min; }
執行結果:
思路:
①首位必為a
②a之後只能是a||b||c||d
③b之後只能是b||c||d
④c之後只能是c||d
⑤d之後只能是d||空
以上有任意一項不滿足,則返回NO,若全滿足,則返回YES
#include<stdio.h> #include<stdbool.h> #define N 100 int main(){ bool jude(char str[N]); char str[N]; scanf("%s",str); if(jude(str)) printf("Y\n"); else printf("N\n"); return 0; } bool jude(char str[N]){ int i; char s; if(str[0]!='a') return false; for(i=0;(s=str[i])!='\0';i++){ if(s=='a'||s=='b'||s=='c'||s=='d'){ if(s=='a'){//a之後只能為a,b,c,d if(str[i+1]!='a'&&str[i+1]!='b'&&str[i+1]!='c'&&str[i+1]!='d') return false; } else if(s=='b'){//b之後只能為b,c,d if(str[i+1]!='b'&&str[i+1]!='c'&&str[i+1]!='d') return false; } else if(s=='c'){//c之後只能為c,d if(str[i+1]!='c'&&str[i+1]!='d') return false; } else if(s=='d'){//d之後只能為d或空 if(str[i+1]!='d'&&str[i+1]!='\0') return false; } }else return false; }//若全部滿足,則屬於題中集合 return true; }
思路:
注:題中給的文法,元素只有a,符號只有+和*
a+a 的字首表示式:+(a,a) 、字尾表示式(a,a)+
可見,a位置不變,只有運算子的位置改變,由字首變為字尾,運算子由括號前變為括號後
如題中給的例子:+ ( * ( a ,+ ( a , a ) ) , a )變為( ( a , ( a , a ) + ) * , a ) +
每個運算子的位置變為,離它最近的括號之後
其他字母,括號位置不變
#include<stdio.h>
#define N 100
int main(){
char *Postfix(char *str);
char str[N];
printf("請輸入正確的字首表示式:");
scanf("%s",str);
char *string = Postfix(str);
printf("字尾表示式為:");
puts(string);
}
char *Postfix(char *str){
int i,j,k,sign,n;
char s,c;
for(i=0;(s=str[i])!='\0';i++)//計算str中有多少個運算子
if(s=='+'||s=='*') n++;
for(i=0;(s=str[i])!='\0'&&n>0;i++){//只需執行n次調整運算子,若超出n次,會將已經調整好的換錯位置
sign=0;//用於記錄括號,每次置零
if(s=='+'||s=='*'){
n--;
for(j=i+1;(c=str[j])!='\0';j++){
if(c=='(') sign++;
else if(c==')') sign--;
//找到離s最近的括號的右括號,將s放在右括號右側,括號內全部向左移一位
if(sign==0){
//依次向前移一位
for(k=i;k<j+1;k++){
str[k] = str[k+1];
}
str[j] = s;
break;
}
}
}
}
return str;
}
執行結果:(輸入例子中的輸入)