1. 程式人生 > >吉大軟體專碩967-2012

吉大軟體專碩967-2012

#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;
}

執行結果:(輸入例子中的輸入)