吉大软件专硕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;
}

 

运行结果:(输入例子中的输入)

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Manigoldo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值