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

    科技2022-08-24  118

    章节

    MOOC第1周编程练习1 输出“Hello World” 第2周编程练习1 逆序的三位数 第3周编程练习1 时间换算2 分队列 第4周编程练习1 奇偶个数2 数字特征值 第5周编程练习1 素数和念整数 第6周编程练习1 高精度小数 第7周编程练习1 多项式加法2 鞍点 第8周编程练习1 单词长度 期末考试最简分式

    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; }
    Processed: 0.009, SQL: 10