MOOC《程序设计入门——C语言》编程练习答案记录

MOOC

非官方提供答案,只是记录一下笔者自己写的通过OJ的答案,有更好方法可一起探讨。

第1周编程练习

1 输出“Hello World”

#include<stdio.h>
int main(){
    printf("Hello World");
}

第2周编程练习

1 逆序的三位数

#include <stdio.h>
int main(){
    int a,b,c;
    int x,y;
    scanf("%d",&x);
    a=x/100;
    b=x/10-x/100*10;
    c=x%10;
    y=c*100+b*10+a;
    printf("%d",y);
    return 0;
}

第3周编程练习

1 时间换算

#include <stdio.h>
int main(){
    int BJT,UTC;
    int h,m;
    scanf("%d",&BJT);
    h=BJT/100;
    m=BJT%100;
    if(h>=8){
        h-=8;
    }else{
        h=24-(8-h);
    }
    UTC=h*100+m;
    printf("%d",UTC);
}

2 分队列

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<=n;i++){
        if(i%2==1 && i!=1){
            printf(" %d",i);
        }else if(i==1){
            printf("1");
        }
    }
    return 0;
}

第4周编程练习

1 奇偶个数

#include<stdio.h>
int main(){
    int a=0,b=0;
    int x;
    while(x!=-1){
        scanf("%d",&x);
        if(x%2 == 1){
            a++;
        }else if(x !=-1) b++;
    }
    printf("%d %d",a,b);
    return 0;
}

2 数字特征值

/*Notes:
1.需额外注意i与相应运算对应的值(i/i+1/i-1)
2.注意特殊极端值的检验,如本题中0和1000000*/
#include<stdio.h>
#include<math.h>
int main(){
    int a[8]={0};   //记录十进制输入数各位数字
    int b[8]={0};   //记录二进制奇偶特征各位数字
    int x=0,y=0,i=0;
    scanf("%d",&x);
    //关于pow函数,%要求的是整型的参数,而pow必须是double的
    //分别获得十进制输入数各位数字
    for(i=1;x / (int)pow(10,i-1)!=0;i++){
        a[i]=(x % (int)pow(10,i)-x % (int)pow(10,i-1))/(int)pow(10,i-1);
    }
    //分别获得二进制奇偶特征各位数字&获得输出数
    for(i--;i>0;i--){
        b[i]=!((a[i]%2)^(i%2));
        y+=b[i]*(int)pow(2,i-1);
    }
    if(x==0){
        y=0;
    }
    printf("%d",y);
    return 0;
}

第5周编程练习

1 素数和

#include<stdio.h>
int main(){
    int n,m;
    int i,x,y;
    int a[201]={0};
    int sum=0;

    scanf("%d %d",&n,&m);
    for(i=1,x=2;i<=m;x++){      //i-第i个素数
        for(y=2;y<=x;y++){      //x-数字,y-除数
            if(x%y==0 && y!= x){//x是非素数
                break;
            }else if(y==x){     //x是素数
                a[i]=x;
                i++;
                continue;
            }
        }
    }
    for(i=1;i<=m;i++){          //累加第n-m个素数
        if(i>=n && i<=m){
            sum += a[i];
        }
    }
    printf("%d",sum);
    return 0;
}

念整数

#include<stdio.h>
#include<math.h>
int main(){
    int x;
    int i;
    int a[7]={0};
    scanf("%d",&x);
    if(x<0){
        printf("fu ");
        x=abs(x);
    }
    for(i=1;i<7;i++){
        if(x/(int)pow(10,i-1)==0) break;
        a[i]=(x%(int)pow(10,i)-x%(int)pow(10,i-1))/(int)pow(10,i-1);
    }
    if(x==0){       //特例0
        a[1]=0;
        i++;
    }
    for(i--;i>0;i--){
        switch(a[i]){
            case 0:printf("ling");break;
            case 1:printf("yi");break;
            case 2:printf("er");break;
            case 3:printf("san");break;
            case 4:printf("si");break;
            case 5:printf("wu");break;
            case 6:printf("liu");break;
            case 7:printf("qi");break;
            case 8:printf("ba");break;
            case 9:printf("jiu");break;
        }
        if(i!=1)printf(" ");
    }
    return 0;
}

第6周编程练习

1 高精度小数

#include <stdio.h>
int main(){
    int a,b,i,m,n;
    scanf("%d/%d",&a,&b);
    printf("0.");
    m = a% b* 10;
    for ( i = 0; i < 200; i++)
    {
        n = m/b;
        m = m%b*10;
        printf("%d",n);
        if (m == 0) break;
    }
    printf("\n");
    return 0;
}

第7周编程练习

1 多项式加法

共4个测试用例,3个通过,1个未通过
用时极多但还是没有找到问题

#include<stdio.h>
//Notes:
//1.0结果
//2.首项尾项表述
//3.系数/幂次为-1或1时的结果
int main(){
    int a[101]={0}; //记录幂次与幂次系数
    int b=0;      //记录最高次
    int x=1,y;    //记录输入的幂次与系数
///输入/
    while(x != 0){
        scanf("%d %d",&x,&y);   //输入
        a[x] += y;       //累加幂次系数
        if(a[x] != 0 && x > b){
            b = x;
        }
    };
    x = 1;
    while(x != 0){
        scanf("%d %d",&x,&y);
        a[x] += y;
        if(a[x] != 0 && x > b){
            b = x;
        }
    };
    ///输出//
    for(int i = b; i >= 0; i--){
        if(i == b){             //首项
            if(i == 0){         //最高项==0
                printf("%d",a[i]);
            }else if(i == 1){   //最高项==1
                if(a[i] == 1){  //&&系数==1
                    printf("x");
                }else if(a[i] == -1){//系数==-1
                    printf("-x");
                }else{          //&&系数!=1/-1
                    printf("%dx",a[i]);
                }
            }else{              //最高项>0除了1
                if(a[i] == 1){
                    printf("x%d",i);
                }else if(a[i] == -1){
                    printf("-x%d",i);
                }else{
                    printf("%dx%d",a[i],i);
                }
            }
        }else if(i == 0){       //尾项
            if(a[i] < 0){       //0次系数<0
                printf("%d",a[i]);
            }else if(a[i] > 0){ //0次系数>0 
                printf("+%d",a[i]);
            }
        }else if(i == 1){       //次数为1的项
            if(a[i] == -1){     //系数==-1
                printf("-x");
            }else if(a[i] < 0){  //系数<0
                printf("%dx",a[i]);
            }else if(a[i] == 1){//系数==1
                printf("+x");
            }else if(a[i] > 0){ //系数>0
                printf("+%dx",a[i]);
            } 
        }else{                  //中间项
            if(a[i] == -1){     //系数==-1
                printf("-x%d",i);
            }else if(a[i] < 0){ //系数<0
                printf("%dx%d",a[i],i);
            }else if(a[i] == 1){//系数==1
                printf("+x%d",i);
            }else if(a[i] > 0){ //系数>0
                printf("+%dx%d",a[i],i);
            }
        }
    }
    return 0;
}

2 鞍点

思路理解:
输入:
1.n–n行n列 1<= n <=100
2.n行n列矩阵
输出:
1.NO or 鞍点下标
易错点:
1.不能根据输入的n直接定义a的n行n列矩阵
2.当一个for循环完整结束后,每个循环后执行语句是执行的
eg.for(c=0; c<n; c++) 该循环结束后,c=n。
3.注意区分不同参数在当前代码所代表的含义(j&&b[i])

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);             //n行n列的n
//不能直接定义为a[n]
    int a[100][100]={0},b[100]={0};//a[100][100]矩阵
                                //b[i]i行最大数的列数
    int flag = 0;               //判断是否有鞍点标志
    int res[2];                 //存储输出鞍点下标
    int i,j,c;                  //i行j列,c行
  
    /***输入矩阵 && 判断并存储i行最大数的列数于b[i]***/
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            scanf("%d",&a[i][j]);
            if(j == 0){
                b[i] == 0;
            }else if(a[i][j] > a[i][b[i]]){
                b[i]=j;
            }
        }
    }
    /*判断i行最大数在该列是否为最小值(与每行数值比较)*/
    for(i=0; i<n; i++){
        for(c=0; c<n; c++){
            if(a[c][b[i]] < a[i][b[i]]){
                break;
            }
        }
        //注意完整结束for循环后c==n
        if(c == n && a[c-1][b[i]] >= a[i][b[i]]){
            flag = 1;   //有鞍点
            res[0] = i;
            res[1] = b[i];  //注意不能写j
            break;
        }
    }

    if(flag == 0){
        printf("NO");
    }else if(flag == 1){
        printf("%d %d",res[0],res[1]);
    }

    return 0;
}

第8周编程练习

1 单词长度

易错点:
1.注意无有效文本不应有输出

#include<stdio.h>
#include<string.h>	//字符串函数
int main(){
    int b = 0;		//字符串长度
    char s[100]="";	//读入字符串
    while(1){
        scanf("%s",&s);
        if(!strlen(s))break;		//当读入无字符,没有输出
        else if(strrchr(s,'.')){	//当读入结尾有句号的输入
            b = strlen(s) - 1;		//去掉结尾句号字符长度
            if(b == 0)break;		//当没有有效输入时没有输出
            printf("%d",b);
            break;
        }
        b = strlen(s);
        printf("%d ",b);
    }
    return 0;
}

期末考试

最简分式

#include<stdio.h>

int main(){
    int i;
    int mul;//因数
    int a,b;//原分数
    int rea,reb;//现分数

    scanf("%d/%d",&a,&b);
    for(i = 1; i <= a; i++){
        if(a%i == 0 && b%i == 0){
            mul = i;
        }
    }
    rea = a/mul;
    reb = b/mul;
    printf("%d/%d",rea,reb);
    return 0;
}
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值