章节
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;
}