一、实验内容
1.实验要求:有一个四位正整数,组成这个四位数的四个数字各不相同,如果把它们的首尾互换,第二位与第三位互换,组成一个新的四位数。原四位数为新四位数的4倍,请找出一个这样的四位数。
代码:
#include<stdio.h> int main() { int a,b,c,d,n1,n2; for(a=1;a<10;a++) for(b=0;b<10;b++) for(c=0;c<10;c++) for(d=1;d<10;d++) { if(a!=b&&a!=c&&a!=d&&b!=c&&b!=d&&c!=d) { n1=a*1000+b*100+c*10+d; n2=d*1000+c*100+b*10+a; if(n1==4*n2) { printf("这个四位数是%d ",n1); } } } return 0; }
程序运行结果:
2.实验要求:
输入任意一个多位的数字,求各位数字之和。如果在【1,12】之内,则输出与和数字对应的月份的英文名称,否则输出***。
样例: 输入123, 输出 6 June
输入12345,输出 15 ***
代码:
#include<stdio.h> int main() { int x,m,sum=0; printf("请输入一个多位数: "); scanf("%d",&x); while(x!=0) { m=x%10; sum=sum+m; x=x/10; } printf("sum=%d ",sum); if(sum==1) printf("January "); else if(sum==2) printf("February "); else if(sum==3) printf("March "); else if(sum==4) printf("April "); else if(sum==5) printf("May "); else if(sum==6) printf("June "); else if(sum==7) printf("July "); else if(sum==8) printf("August "); else if(sum==9) printf("Septemper "); else if(sum==10) printf("Octorber "); else if(sum==11) printf("November "); else if(sum==12) printf("December "); else printf("***"); }
程序运行结果:
3.实验要求:
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:输入在一行中给出A。
输出格式:输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:2
输出样例:234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
代码:
#include<stdio.h> int main() { int A,b,c,d,i=0; printf("请输入一个不超过6的正整数: "); scanf("%d",&A); if(A>0&&A<=6) { for(b=A;b<=A+3;b++) for(c=A;c<=A+3;c++) for(d=A;d<=A+3;d++) { if(b!=c&&b!=d&&c!=d) { printf("%d",b*100+c*10+d); i++; if(i%6!=0) { printf(" "); } else { printf(" "); } } } } else { printf("error "); } return 0; }
程序运行结果:
4.实验要求:自动出题器
代码:
#include<stdio.h> #include<time.h> #include<stdlib.h> int main() { int a,b,c,d1,d2,g,s1,s2,n=0; char op,op1='Y'; float k; while(op1=='Y') { for(n=1;n<=5;n++) { srand(time(NULL)); a=rand()%100+1; b=rand()%100+1; c=rand()%100+1; g=0; if(c>=1&&c<=25) { op='+'; printf("%d+%d=?",a,b); printf("请输入你的答案: "); scanf("%d",&s1); s2=a+b; if(s1==s2) { printf("回答正确"); g++; } else { printf("回答错误,正确答案是%d ",s2); } } if(c>=26&&c<=50) { op='-'; printf("%d-%d=?",a,b); printf("请输入你的答案: "); scanf("%d",&s1); s2=a-b; if(s1==s2) { printf("回答正确"); g++; } else { printf("回答错误,正确答案是%d ",s2); } } if(c>=51&&c<=75) { op='*'; printf("%d*%d=?",a,b); printf("请输入你的答案: "); scanf("%d",&s1); s2=a*b; if(s1==s2) { printf("回答正确"); g++; } else { printf("回答错误,正确答案是%d ",s2); } } if(c>=76&&c<=100) { op='/'; printf("%d/%d=?",a,b); printf("请输入商和余数: "); scanf("%d%d",&s1,&d1); s2=a/b; d2=a%b; if(s1==s2&&d1==d2) { printf("回答正确"); g++; } else { printf("回答错误,商是%d,余数是%d ",s2,d2); } } } k=(float)g/5; { printf("做对%d次,正确率%.2f",g,k); } printf("是否继续Y or N "); scanf("%c",&op1); } return 0; }
程序运行结果:
二、知识点总结
1.对于有些题可以先穷举后优化减少循环次数;
2.求a和b最大公约数:
法一:设i为1; 如果a和b都能被这个i整除,则记下这个i; i+1重复上一步,直到等于a或b; i为最大公约数;
法二:辗转相除法:a/b,令r为所得余数(0<=r<b)若r=0,算法结束b为答案; 互换:b→a,r→b,并返回第一步
三、实验总结
1,随机数字的表示为srand(time(NULL)); a=rand()%100+1;
2,注意循环语句中大括号的位置和各个语句的位置;
3,程序结束时大括号填齐;
4,注意每条语句后是否需要加分号;
5,注意每个赋值式子的位置。