第一篇:山科大 C语言程序设计编程精选44例
问题 1: 三个数比较大小
题目描述
从键盘上输入0~100之间的三个数,按从小到大的顺序输出。
输入
输入只有一行,为三个整数。
输出
按从小到大输出这三个数。
样例输入 10 20 样例输出 15 20 提示
用if语句判断各种情况可以解决这个问题。
解答:
#include
int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
if(a>=b)
{
if(b>=c)
printf(“%d %d %d”,c,b,a);
else
{
if(a>=c)
printf(“%d %d %d”,b,c,a);
else
printf(“%d %d %d”,b,a,c);
}
}
else
{
if(b printf(“%d %d %d”,a,b,c); else { if(a printf(“%d %d %d”,a,c,b); else printf(“%d %d %d”,c,a,b); } } } 问题 2: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数 题目描述 输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n 输入 输入三个整数,依次为k、m、n。 输出 从小到大输出符合题意的所有整数,两数之间用一个空格分开。 样例输入 2 3 样例输出 3 4 8 9 10 14 15 提示 难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。 解答: #include a=n;else a=m;printf(“%d”,a);for(i=a+1;i<=k;i++) if(i%m==0||i%n==0) { if(i%m==0&&i%n==0) printf(“"); else printf(” %d“,i); } } 问题 3: A+B Problem 题目描述 计算a+b,0<=a,b<1000。 输入 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 输出 每行输出一个a+b的值,顺序与输入对应。 样例输入 2 10 20 样例输出 3 30 提示 OJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。 解答: #include printf(”%dn“,a+b);} 问题 4: A+B Problem(II): Input/Output Pratice 题目描述 计算a+b,0<=a,b<1000。 输入 输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。 输出 每行输出一个a+b的和,顺序与输入对应。 样例输入 1 2 10 20 样例输出 3 30 提示 N给出了测试样例数,用for循环处理方便。 解答: #include scanf(”%d%d“,&a,&b); printf(”%dn“,a+b);} } 问题 5: A+B Problem(III): Input/Output Pratice 题目描述 计算a+b,0<=a,b<1000。 输入 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。 输出 每行输出一个a+b的值,顺序与输入对应。 样例输入 2 10 20 0 0 样例输出 30 提示 练习break的使用。 解答: #include if(a==0&&b==0) break; printf(”%dn“,a+b);} } 问题 6: A+B Problem(IV): Input/Output Pratice 题目描述 计算a+b,0<=a,b<1000。 输入 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 输出 每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。 样例输入 2 10 20 15 35 样例输出 30 50 提示 由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。 解答: #include printf(”n%dn“,a+b);} 问题 7: n个数的最大值和最小值 问题描述 找出n个数中最大的数和最小的数,并将它们的值输出出来。 输入 输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。输出 输出为两行,格式见sample。 样例输入 0 1-1 样例输出 The maximum number is 1.The minimum number is-1.提示 分隔符是空格还是回车都是空白符,对scanf(”%d“)来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。 解答: #include scanf(”%d“,&a); if(a>max) max=a; if(a min=a;} printf(”The maximum number is %d.n“,max);printf(”The minimum number is %d.“,min);} 问题 8: 成绩的等级 题目描述 把百分制的考试成绩转换成五级制的成绩: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing 不在0~100之间的输入是非法数据,输出“Error”。 输入 输入多行,每行一个整数。 输出 输入所对应的成绩等级。 样例输入 -1 81 92 35 68 72 100 样例输出 Error Good Excellent Failing Pass Average Excellent 提示 用switch语句解决这个问题比较方便。 解答: #include if(a<0||a>100) printf(”Errorn“); else { switch(a/10) { case 0: case 1: case 2: case 3: case 4: case 5:printf(”Failingn“);break; case 6:printf(”Passn“);break; case 7:printf(”Averagen“);break; case 8:printf(”Goodn“);break; case 9: case 10:printf(”Excellentn“);break; } } } 问题 9: 只有一个二元运算符的表达式运算 题目描述 编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。 输入 每行输入一个表达式,格式为:二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。测试样例不存在除数为0的情况。输入以a和b为0,且用一个空格分开结束。输出 每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalid op”。 样例输入 33+5 8*9 2.2 1-6 17/3 9%3 0 0 样例输出 invalid op-5 5 0 提示 教材上有非常相似的例题可以参考。#include if(a==0&&c==' '&&b==0) goto loop; else switch(c){ case'+': printf(”%dn“,a+b); break;case'-': printf(”%dn“,a-b); break;case'*': printf(”%dn“,a*b); break;case'/': printf(”%dn“,a/b); break;case'%': printf(”%dn“,a%b); break;default: printf(”invalid opn“); } } loop: i=101;} 问题 10: 求100以内的素数 题目描述 素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。 输入 输入为两个整数m和n,满足0<=m<=n<=100。 输出 从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。 输出的所有数在两行“=====”之间。 样例输入 12 样例输出 ===== 11 7 5 3 2 ===== 提示 利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。 解答: #include q=0; for(i=2;i { if(j%i!=0) q++; } if(q==j-2) printf(”%dn“,j);} printf(”=====“);} 问题 11: 摄氏——华氏温度转换表 题目描述 已知华氏温度F,转换为摄氏温度C的公式为C=(F-32)*5/9。 输出给定范围(从low到high)和步长(step)的摄氏——华氏温度转换表 输入 第1行若为“C->F”表示输出:摄氏——华氏温度转换表,若为“F->C”表示输出:华氏——摄氏温度转换表。 第2、3行为两个整数:high和low,其值在-100到200之间。第4行为step,step精确到小数点后1位。 输出 输出第一行为C和F,分别表示摄氏和华氏,与小数点对齐。若输出摄氏——华氏温度转换表,则C在前、F在后;反之,则输出华氏——摄氏温度转换表。 从输出的第2行开始为从温度low到温度high(包括low和high)的转换表,温度输出精确到小数点后1位,表格被“->”分为两个宽度相同的部分,其它的测试样例也不会给出超出宽度的数据,格式详见sample。 样例输入 C->F-10 40 2.5 样例输出 C-> F-10.0-> 14.0-7.5-> 18.5-5.0-> 23.0-2.5-> 27.5 0.0-> 32.0 2.5-> 36.5 5.0-> 41.0 7.5-> 45.5 10.0-> 50.0 12.5-> 54.5 15.0-> 59.0 17.5-> 63.5 20.0-> 68.0 22.5-> 72.5 25.0-> 77.0 27.5-> 81.5 30.0-> 86.0 32.5-> 90.5 35.0-> 95.0 37.5-> 99.5 40.0-> 104.0 提示 输出格式可以通过sample分析出来,因为两栏的总宽度是固定的。一个隐藏的陷阱是step是浮点数,某些浮点数是无法精确存储的,因此经过一定量的计算后这个误差会影响到浮点数的相等性判断,需要加上精度控制。 解答: #include double low,high; double step,c,f; char ch1,ch2; scanf(”%c->%c“,&ch1,&ch2); if(ch1=='C'&&ch2=='F') { scanf(”%lf%lf%lf“,&low,&high,&step); f=(double)9/5*low+32; if(low==-100||f<=-100) { printf(” C-> F“); while(low<=high+0.01) { f=low*9.0/5.0+32; printf(”n%6.1lf-> %6.1lf“,low,f); low+=step; } return 0; } printf(” C-> F“); while(low<=high+0.01) { f=low*9.0/5.0+32; printf(”n%5.1lf-> %5.1lf“,low,f); low+=step; } return 0; } else if(ch1=='F'&&ch2=='C') { scanf(”%lf%lf%lf“,&low,&high,&step); c=(low-32)*((double)5/9); if(low==-100||c<=-100) { printf(” F-> C“); while(low<=high+0.01) { c=(low-32)*5/9.0; printf(”n%6.1lf-> %6.1lf“,low,c); low+=step; } return 0; } printf(” F-> C“); while(low<=high+0.01) { c=(low-32)*5/9.0; printf(”n%5.1lf-> %5.1lf“,low,c); low+=step; } return 0; } } 问题 12: 1!+2!+…+k!=? 题目描述 求1!+2!+…+k!=?,并判断是否溢出。 输入 输入为一个正整数k。 输出 若1!+2!+…+k!的值溢出unsigned(无符号整型)的范围输出“overflow”,否则输出1!+2!+…+k!的结果。 样例输入 样例输出 153 提示 如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么? 解答: #include int i,j; unsigned int s,b,a;s=0; scanf(”%d“,&j); b=1; for(i=1;i<=j;i++) { a=b; b=b*i; if((double)b/a { printf(”overflown“); return 0; } s=s+b; } printf(”%un“,s); return 0;} 问题 13: 输出整数的最低两位 题目描述 把一个整数的最低两位打印出来,不输出整数的符号。 输入 输入为一个整数n,不会超出int类型的数据范围。 输出 输出n的最低两位数字。但是,输入的数字本身不足两位时,不应当补0。如,输入为“1”,则输出为“1”。 样例输入 -102 样例输出 02 提示 printf函数可以完成补0的操作。 解答: #include c=-a; if(c<100) printf(”%d“,c); else { b=c-100*(c/100); printf(”%.2d“,b); } } else { if(a<100) printf(”%d“,a); else { b=a-100*(a/100); printf(”%.2d“,b); } } } 问题 14: 产生等差序列之一 题目描述 根据给出的初始数、公差和序列长度求等差序列。 输入 输入为一行,格式见sample。其中,start为初始数,step为公差,times为序列长度。满足,times>0,step不为0。 输出 把这个等差序列输出在一行里,序列两数之间用一个空格分隔。 样例输入 start = 1, step = 2, times = 100 样例输出 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 解答: #include st=st+s; printf(” %d“,st); } } 问题 15: 产生等差序列之二 题目描述 根据给出的初始数、公差和终止条件求等差序列。 输入 输入为一行,格式见sample。其中,start为初始数,step为公差,end为终止条件。满足,step不为0,并且start和end的大小关系与step的方向一致。end不一定是序列的最后一个数。 输出 把这个等差序列输出在一行里,序列两数之间用一个空格分隔。 样例输入 start = 1, step = 2, end = 200 样例输出 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 提示 根据start和step的大小关系,判断序列终止的条件可能不同。 解答: #include for(st=st+s;st<=end;st=st+s) printf(” %d“,st); } else { for(st=st+s;st>=end;st=st+s) printf(” %d“,st);} } 问题 16: 辗转相除法 题目描述 辗转相除法,也称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。两个整数的最大公约数(亦称公约数)是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 − 105 = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。例如,计算a = 1071和b = 462的最大公约数的过程如下:从1071中不断减去462直到小于462(可以减2次,即商q0 = 2),余数是147: 1071 = 2 × 462 + 147.然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21: 462 = 3 × 147 + 21.再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数: = 7 × 21 + 0.此时,余数是0,所以1071和462的最大公约数是21。 输入 输入为多行,每行有一对非负整数a,b,且a*b不会超出int类型的数据范围。输入至EOF结束。 输出 每行输出一对a,b的最大公约数和最小公倍数,顺序与输入对应。 样例输入 1 2 3 2 2 3 2 4 6 7 5 12 6 18 9 24 36 样例输出 1 1 6 2 2 1 6 2 12 1 35 6 12 9 18 12 72 提示 按照题目描述所给的算法解题,注意以下几点:辗转相除法对两个数的大小关系有要求,根据倍数和约数的数学定义,一个非0数和0的约数是多少?辗转相除法的计算过程是符合这种定义的。 解答: #include c=a*b; if(a==0&&b!=0) printf(”%d %dn“,b,a); else if(a!=0&&b==0) printf(”%d %dn“,a,b); else { while(a!=b) { if(a>b) a=a-b; if(a b=b-a; } printf(”%d %dn“,a,c/a); } } } 问题 17: Sum Problem 题目描述 计算若干整数的和,这些整数都是小于1000的非负整数。 输入 输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。 输出 每组测试样例对应一行输出,输出所给的N个整数之和,顺序与输入对应。 样例输入 1 2 3 5 10 15 20 30 50 样例输出 125 提示 用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 解答: #include s=0; for(i=1;i<=n;i++) { scanf(”%d“,&a); s=s+a; } printf(”%dn“,s);} } 问题 18: Sum Problem(II): Input/Output Pratice 题目描述 计算若干整数的和,这些整数都是小于1000的非负整数。 输入 输入的第一行是一个整数M,后面有M个测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。 输出 每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。 样例输入 3 1 2 3 5 10 15 20 30 50 样例输出 125 提示 用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 解答: #include scanf(”%d“,&n);{ s=0; for(i=1;i<=n;i++) { scanf(”%d“,&a); s=s+a; } } } } printf(”%dn“,s);问题 19: Sum Problem(III): Input/Output Pratice 题目描述 计算若干整数的和,这些整数都是小于1000的非负整数。 输入 输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。当输入的N为0时表示输入结束。 输出 每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。 样例输入 1 2 3 5 10 15 20 30 50 0 样例输出 125 提示 用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 解答: #include { if(n==0) break; else { s=0; for(i=1;i<=n;i++) { scanf(”%d“,&a); s=s+a; } printf(”%dn“,s); } } } 问题 20: Sum Problem(IV): Input/Output Pratice 题目描述 计算若干整数的和,这些整数都是小于1000的非负整数。 输入 输入的第一行是一个整数M,后面有M个测试用例。每个测试用例以一个整数N开始,后面接着是N个整数。 输出 每组测试用例对应一行输出,为所给的N个整数之和,顺序与输入对应。两样例的输出之间用一个空行分隔开。 样例输入 3 1 2 3 5 10 15 20 30 50 样例输出 6 125 提示 用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 解答: #include scanf(”%d“,&n);{ s=0; for(i=1;i<=n;i++) { scanf(”%d“,&a); s=s+a; } printf(”%dn“,s);} for(j=2;j<=m;j++){ scanf(”%d“,&n);{ s=0; for(i=1;i<=n;i++) { scanf(”%d“,&a); s=s+a; } printf(”n%dn“,s);} } } 问题 21: 序数的后缀 题目描述 英文中经常用阿拉伯数字加上字母后缀表示“第几“这样的序数词。比如,”第10次会面“通常写成”10th meeting“。 后缀来源于英文的序数词:第1的英文是first,写成”1st‘;第2的英文是second,写成“2nd”;第3的英文是third,写成“3rd”,第4是fourth,写成“4th”,以后的数字都加“th”。在这里规定,所有后缀为1的数字都写成“st”结尾,后缀为2的数字写成“nd”结尾,后缀为3的英文写成“rd”结尾,其他的写成“th”结尾。 输入 输入为多个很小的正整数,当输入为0时表示输入结束。 输出 输出为多行,每行对应一个输入数字的序数表示。 样例输入 2 3 4 5 10 11 12 13 14 0 样例输出 1st 2nd 3rd 4th 5th 10th 11st 12nd 13rd 14th 提示 用if语句似乎更容易些。 解答: #include if(a==0) break; else { if(a%10==1) printf(”%dstn“,a); if(a%10==2) printf(”%dndn“,a); if(a%10==3) printf(”%drdn“,a); } } } if(a%10==4||a%10==5||a%10==6||a%10==7||a%10==8||a%10==9||a%10==0)printf(”%dthn“,a);问题 22: Sequence Problem : Array Pratice 题目描述 整数序列是一串按特定顺序排列的整数,整数序列的长度是序列中整数的个数,不可定义长度为负数的整数序列。 两整数序列A、B的和定义为一个新的整数序列C,序列C的长度是A、B两者中较长的一个,序列C的每个位置上的整数都是A、B对应位置之和。若序列A、B不等长,不妨假设A比B整数多,那么序列C中多出B的那部分整数视作A的对应位置上的整数与0相加。你的任务是计算符合某些要求的整数序列的和,这些序列中的整数都是小于1000的非负整数。 输入 输入为多行,直到文件末尾结束。每行第一个整数为N(N<=1000),后接一个长度为N的整数序列。 输出 对输入的整数序列两两相加:第1行和第2行相加、第3行和第4行相加……按顺序输出结果:每行输出一个整数序列,每两个整数之间用一个空格分隔。若序列数目不为偶数,则视作补一个长度为0的整数序列相加。 值得注意的是一个长度为0的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。 样例输入 1 2 3 5 10 15 20 30 50 4 100 200 300 400 样例输出 11 17 23 30 50 100 200 300 400 提示 这里最少要用到一个数组来存数整数序列或整数序列的和。 解答: #include j++; if(j%2!=0) { for(i=0;i scanf(”%d“,&a[i]); } else { for(p=0;p scanf(”%d“,&b[p]); } if(j%2!=1) { if(i<=p) { for(k=0;k { if(k==0) { printf(”%d“,a[k]+b[k]); a[k]=0; b[k]=0; } else { printf(” %d“,a[k]+b[k]); a[k]=0; b[k]=0; } } printf(”n“); } else { for(k=0;k { if(k==0) { printf(”%d“,a[k]+b[k]); a[k]=0; b[k]=0; } else { printf(” %d“,a[k]+b[k]); a[k]=0; b[k]=0; } } printf(”n“); } } } if(m!=0&&j%2==1) { for(i=0;i { if(i==0) printf(”%d“,a[i]); else printf(” %d“,a[i]); } printf(”n“); } if(m==0&&j%2==1) printf(”n“);} 问题 23: Sequence Problem(II): Array Pratice 题目描述 整数序列是一串按特定顺序排列的整数,整数序列的长度是序列中整数的个数,不可定义长度为负数的整数序列。 两整数序列A、B的和定义为一个新的整数序列C,序列C的长度是A、B两者中较长的一个,序列C的每个位置上的整数都是A、B对应位置之和。若序列A、B不等长,不妨假设A比B整数多,那么序列C中多出B的那部分整数视作A的对应位置上的整数与0相加。你的任务是计算符合某些要求的整数序列的和,这些序列中的整数都是小于1000的非负整数。 输入 输入的第一行为一个整数M(M>0),后面有M行输入。每行输入为不超过1000个整数的整数序列,每个整数序列的输入均以0结束。 输出 对输入的整数序列两两相加:第1行和第2行相加、第3行和第4行相加……按顺序输出结果:每行输出一个整数序列,每两个整数之间用一个空格分隔。若序列数目不为偶数,则视作补一个长度为0的整数序列相加。 值得注意的是一个长度为0的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。 样例输入 1 2 3 0 10 15 20 30 50 0 100 200 300 400 0 样例输出 17 23 30 50 100 200 300 400 提示 这里最少要用到一个数组来存数整数序列或整数序列的和。一个省事的做法是把数组定义的稍微大一点,因为有时你的程序可能会边界处理的不是太好。 解答: #include int i,j,x,y,q;y=0; scanf(”%d“,&x); if(x%2==0) { for(q=0;q { int a[2000]={0},b[2000]={0},c[2000]={0}; for(j=0;scanf(”%d“,&a[j]);j++) { if(a[j]==0) break; } for(i=0;scanf(”%d“,&b[i]);i++) { if(b[i]==0) break; } if(i>j) j=i; i=0; while(i { if(i==0) printf(”%d“,a[0]+b[0]); else printf(” %d“,a[i]+b[i]); i++; } printf(”n“); } } else { for(q=0;q<(x+1)/2;q++) { int a[2000]={0},b[2000]={0},c[2000]={0}; j=0; y=y+2; if(x+2-y>1) { for(j;scanf(”%d“,&a[j]);j++) { if(a[j]==0) break; } for(i=0;scanf(”%d“,&b[i]);i++) { if(b[i]==0) break; } if(i>j) j=i; i=0; while(i { if(i==0) printf(”%d“,a[0]+b[0]); else printf(” %d“,a[i]+b[i]); i++; } printf(”n“); } } } } else { for(j=0;scanf(”%d“,&a[j]);j++){ if(a[j]==0) break;} i=0;while(i printf(”%d“,a[0]);else printf(” %d“,a[i]);i++;} printf(”n“);} 问题 24: Sequence Problem(III): Array Pratice 题目描述 整数序列是一串按特定顺序排列的整数,整数序列的长度是序列中整数的个数,不可定义长度为负数的整数序列。 两整数序列A、B的和定义为一个新的整数序列C,序列C的长度是A、B两者中较长的一个,序列C的每个位置上的整数都是A、B对应位置之和。若序列A、B不等长,不妨假设A比B整数多,那么序列C中多出B的那部分整数视作A的对应位置上的整数与0相加。你的任务是计算符合某些要求的整数序列的和,这些序列中的整数都是小于1000的非负整数。 输入 输入的第一行为一个整数M(M>0),后面有M行输入。每行第一个整数为N(N<=1000),后接一个长度为N的整数序列。 输出 对输入的整数序列两两相加:第1行和第2行相加、第2行和第3行相加……按顺序输出结果:每行输出一个整数序列,每两个整数之间用一个空格分隔。若最后序列不足两个,则视作补一个长度为0的整数序列相加。 值得注意的是一个长度为0的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。样例输入 3 1 2 3 5 10 15 20 30 50 4 100 200 300 400 样例输出 17 23 30 50 110 215 320 430 50 100 200 300 400 提示 这里最少要用到两个数组来存储整数序列。 解答: #include if(i%2!=0) { scanf(”%d“,&y); for(j=0;j scanf(”%d“,&a[j]); if(i!=1) { if(y>p) x=y; else x=p; if(x==0) printf(”n“); else { j=0; while(j { if(j==0) printf(”%d“,a[j]+b[j]); else printf(” %d“,a[j]+b[j]); b[j]=0; j++; } printf(”n“); } } if(q==1&&q!=1) { if(y==0) printf(”n“); else { for(j=0;j { if(j==0) printf(”%d“,a[j]); else printf(” %d“,a[j]); } } } if(i==q) { for(j=0;j { if(j==0) printf(”%d“,a[j]); else printf(” %d“,a[j]); } printf(”n“); } } else { scanf(”%d“,&p); for(j=0;j scanf(”%d“,&b[j]); if(y>p) x=y; else x=p; if(x==0) printf(”n“); else { j=0; while(j { if(j==0) printf(”%d“,a[j]+b[j]); else printf(” %d“,a[j]+b[j]); a[j]=0; j++; } printf(”n“); } } } if(i==q){ j=0; while(j { if(j==0) printf(”%d“,b[j]); else printf(” %d“,b[j]); j++; } printf(”n“);} } 问题 25: Matrix Problem : Array Pratice 题目描述 求一个m×n阶矩阵A的转置矩阵AT。矩阵A的每个元素都在int类型的范围之内。 输入 输入的第一行为一个整数M(M>0),后面有M组输入数据。每组数据以两个正整数m和n开始,满足0 输出 输出为多组,每组输出A的转置矩阵AT。矩阵的输出为:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。每两组输出之间用一个空行分隔开。 样例输入 3 3 1 2 3 4 5 6 7 8 9 样例输出 1 4 7 2 5 8 3 6 9 提示 二维数组存储矩阵。 解答: #include scanf(”%d%d“,&m,&n);for(i=0;i for(j=0;j scanf(”%d“,&a[i][j]);for(i=0;i for(j=0;j printf(”%d “,a[j][i]); printf(”%d“,a[m-1][i]); printf(”n“);} for(k=1;k scanf(”%d%d“,&m,&n); for(i=0;i for(j=0;j scanf(”%d“,&a[i][j]); printf(”n“); for(i=0;i { for(j=0;j printf(”%d “,a[j][i]); printf(”%d“,a[m-1][i]); printf(”n“); } } } 问题 26: Matrix Problem(II): Array Pratice 题目描述 求两个矩阵A、B的和。根据矩阵加法的定义,只有同阶的矩阵才能相加。可以确保所有运算结果都在int类型的范围之内。 输入 输入数据为多个矩阵,每个矩阵以两个正整数m和n开始,满足0 输出 对输入的矩阵两两相加:第1个和第2个相加、第3个和第4个相加……按顺序输出矩阵相加的结果:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。 若输入的矩阵不为偶数个,最后剩余的矩阵不产生任何输出。 不满足矩阵加法定义的数据输出“Not satisfied the definition of matrix addition!” 每两组输出之间用一个空行分隔开。 样例输入 3 1 2 3 4 5 6 7 8 9 3 3 9 8 7 6 5 4 3 2 1 3 3 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 样例输出 10 10 10 10 10 10 10 10 Not satisfied the definition of matrix addition!提示 矩阵的加法就是对应位置上的元素相加。 解答: #include for(i=0;;i++) { int a[200][200]={0},b[200][200]={0}; scanf(”%d%d“,&m,&n); if(m==0&&n==0) break; else { for(j=0;j for(k=0;k scanf(”%d“,&a[j][k]); } for(;scanf(”%d%d“,&e,&f)!=EOF;) { x=2; y=y+1; for(j=0;j for(k=0;k scanf(”%d“,&b[j][k]); break; } if(e==0&&f==0) break; if(y!=2) printf(”n“); } } if(x==2){ if(m!=e||n!=f){ printf(”Not satisfied the definition of matrix addition!“); printf(”n“);} else { j=0;while(j k=0; while(k { if(k==0) printf(”%d“,a[j][k]+b[j][k]); else printf(” %d“,a[j][k]+b[j][k]); k++; } if(j printf(”n“); j++;} printf(”n“);} } 问题 27: Matrix Problem(III): Array Pratice 题目描述 求两个矩阵A、B的乘积C=AB。根据矩阵乘法的定义,只有A的列数和B的行数相同才能相乘。可以确保所有运算结果都在int类型的范围之内。 输入 输入数据为多个矩阵(最少2个),每个矩阵以两个正整数m和n开始,满足0 输出 对输入的矩阵两两相乘:第1个和第2个相乘、第1个和第2个相乘的结果和第3个相乘……按顺序输出矩阵相乘的结果:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。 若前k个矩阵相乘的结果和第k+1个矩阵无法相乘(即不满足矩阵乘法定义),则输出“Not satisfied the definition of matrix multiplication!”。然后用第k+1个矩阵去和第k+2个矩阵相乘。最后一个矩阵只做乘数。 每两组输出之间用一个空行分隔开。 样例输入 3 1 1 1 1 1 1 3 3 1 2 3 4 5 6 7 8 9 3 1 0 0 0 0 0 样例输出 15 18 12 15 18 0 0 提示 矩阵的乘法就是一行乘以一列加起来做一个元素。 解答: #include int m,n,i,j,p,k,c,d,o,q; int a[100][100]={0},b[100][100]={0},e[100][100]={0}; for(k=1;;k++) { if(k==1&&k%2==1) { scanf(”%d“,&m); scanf(”%d“,&n); } else if(k%2==0) { scanf(”%d“,&m); scanf(”%d“,&n); } if(m==0&&n==0) return 0; else { if(k==1) { i=0; while(i { j=0; while(j { scanf(”%d“,&a[i][j]); j++; } i++; } } else if((k>1)&&(k%2!=0)) { for(i=0;i for(j=0;j a[i][j]=e[i][j]; } else { for(p=0;p for(q=0;q scanf(”%d“,&b[p][q]); if(j==p) { for(c=0;c { d=0; while(d { e[c][d]=0; for(o=0;o e[c][d]+=a[c][o]*b[o][d]; d++; } } for(c=0;c { for(d=0;d { if(d==0) printf(”%d“,e[c][d]); else printf(” %d“,e[c][d]); } printf(”n“); } } else { printf(”Not satisfied the definition of matrix multiplication!n“); for(c=0;c for(d=0;d e[c][d]=b[c][d]; } } } if(k%2==0) printf(”n“); } } 问题 28: 十进制整数转二进制 题目描述 给出一个十进制的非负整数x,x<=216,把它转换成二进制数输出。 输入 输入为多行,每行一个整数x,至读入EOF结束。 输出 每行输出x对应的二进制数值。 样例输入 0 1 3 33 65535 样例输出 0 1 11 100001 ***1 提示 本题有多种解法:可以用循环迭代对2的除法和取余操作,不过处理的顺序与输出顺序相反,需要利用数组存储;用取对数或从大到小减去2的整数次幂的方法计算与输出顺序是相同的;也可以用printf()把十进制的数值处理成十六进制,然后1位十六进制转4位二进制;也可以用位运算处理。 解答: #include if(x==0) printf(”%dn“,x); else { i=0; int a[100]={0}; for(;x!=0;) { y=x%2; x=x/2; a[i]=y; i++; } for(j=i-1;j>=0;j--) printf(”%d“,a[j]); printf(”n“); } } } 问题 29: 魔方阵 题目描述 所谓N阶魔方阵,是一个N*N的方阵,其元素由1到N^2组成,且方阵每行每列以及对角线的元素和相等。如三阶魔方阵: 8 1 6 3 5 7 4 9 2 魔方阵的规律如下: 从1~N*N的 各个数依次如下规则存放:(1)1在第一行中间一列; (2)每一个数存放的行比前一个数的行数减一,列数加一(如上的三阶方阵5在4的上一行,后一列); (3)如果上一个数在第一行,则下一个数在最后一行,列数加一;(4)如果上一个数在最后一列,则下一个数在第一列,行数减一; (5)如果按上述规则确定的位置已经有数,或上一个数在第一行第N列,则下一个数放在上一个数的正下方。 输入 输入包含多组数据,每组为一个小于100的正奇数。 输出 对于每个输入的N,输出N阶魔方阵;两组数据之间用一个空行分隔。方阵中每行每两个数之间有一个空格,行首和行末没有多余的空格。 样例输入 样例输出 1 6 3 5 7 4 9 2 解答: #include sqrt[row][col]=i; temp_row=row; temp_col=col; if(row==1&&col==n) row++; else { row--; col++; if(row==0) row=n; if(col>n) col=1; if(sqrt[row][col]!=0) { row=temp_row+1; col=temp_col; if(row>n) row=1; } } } j=1;while(j<=n){ k=1; while(k<=n) { if(k%n==0) printf(”%dn“,sqrt[j][k]); else printf(”%d “,sqrt[j][k]);k++; } j++;} for(;scanf(”%d“,&n)!=-1;){ printf(”n“);int sqrt[100][100]={0};col=(n+1)/2;for(i=1;i<=n*n;i++){ sqrt[row][col]=i; temp_row=row; temp_col=col; if(row==1&&col==n) { row++; } else { row--; col++; if(row==0) row=n; if(col>n) col=1; if(sqrt[row][col]!=0) { row=temp_row+1; col=temp_col; if(row>n) row=1; } } } j=1;while(j<=n){ k=1; while(k<=n) { if(k%n==0) printf(”%dn“,sqrt[j][k]); else printf(”%d “,sqrt[j][k]);k++; } j++;} } } 问题 30: 兔子的繁殖问题 题目描述 假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)? 这个问题是意大利数学家菲波那契(Fibonacci)在他1202年出版的《算盘全书》中提出来的,从第一对刚出生的小兔开始每月的兔子数被乘坐菲波那契序列。 输入 输入的第一个数为n,接下来有n个数字。每个数字为一个月份m(m<=45)。 输出 输出为n行,每行为第m个月后的兔子总数。 样例输入 1 2 3 4 5 10 样例输出 2 3 5 8 89 提示 可以先计算出菲波那契序列并存储下来,然后查询出每月兔子数。 解答: #include a[i]=a[i-1]+a[i-2]; i++;} scanf(”%d“,&x); for(i=1;i<=x;i++){ scanf(”%d“,&n); b[i]=a[n];} for(i=1;i<=x;i++) printf(”%dn“,b[i]);} 问题 31: 简单的整数排序 题目描述 对给出的若干整数按从小到大排序。 输入 输入的第一个数为n(n<=1000),后接n个整数。 输出 按从小到大的顺序输出这些整数,每两个整数之间用一个空格分隔开,最后一个整数后面没有空格。 样例输入 3 9 1 5 2 8 5 6 7 3 样例输出 2 3 3 5 5 6 7 8 9 提示 排序前必须把所有的整数都存储下来。因为只有最多1000个数,1秒的时间足够任何排序算法运行处结果来。 解答: /*本题使用插入排序*/ #include scanf(”%d",&a[i]);for(j=1;j p=0; while(p { if(a[p]>a[j]) break; else p++; } m=a[j]; for(i=j;i>p;i--) a[i]=a[i-1]; a[p]=m; } C语言程序设计习题(编程类) 1、从键盘输入任意的字符,按下列规则进行分类计数。 第一类 '0','1','2','3','4','5','6','7','8','9' 第二类 '+','-','*','/','%','=' 第三类 其它字符 当输入字符''时先计数,然后停止接收输入,打印计数的结果。参考答案: #include class1=class2=class3=0; /* 初始化分类计数器 */ do { ch=getch(); switch(ch){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': class1++; break; /* 对分类1计数 */ case '+': case '-': case '*': case '/': case '%': case '=': class2++; break; /* 对分类2计数 */ default: class3++; break; /* 对分类3计数 */ } }while(ch!= ''); /* 字符''在C程序中要使用转义符'' */ printf(“class1=%d, class2=%d, class3=%dn”, class1, class2, class3); } 2、从键盘输入十个整数,用插入法对输入的数据按照从小到大的顺序进行排序,将排序后的结果输出。参考答案: void main(){ int i,j,num,a[10]; for(i=0;i<10;i++){ printf(“Enter No.%d:”, i+1); scanf(“%d”,&num); for(j=i-1;j>=0&&a[j]>num;j--)a[j+1]=a[j]; a[j+1]=num; } for(i=0;i<10;i++)printf(“No.%d=%dn”, i+1, a[i]); } 3、输入一个正整数,要求以相反的顺序输出该数。例如输入12345,输出位54321。参考答案: void main(){ int n; printf(“Please enter n:”); scanf(“%d”,&n); while(n>0){ printf(“%d”,n%10); n=n/10; } } 4、编写程序,读入一个整数N;若N为非负数,则计算N到2×N之间的整数和;若N为一个负数,则求2×N到N之间的整数和。分别利用for和while写出两个程序。参考答案: void main(){ int i,n; long s1=0,s2=0; printf(“Please enter N:”); scanf(“%d”,&n); if(n>=0)for(i=n;i<=2*n;i++)s1=s1+i; else for(i=n;i>=2*n;i--)s1=s1+i; i=n; if(i>=0)while(i<=2*n)s2=s2+i++; else while(i>=2*n)s2=s2+i--; printf(“Result1=%ld result2=%ldn”,s1,s2); } 5、一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,•所得的商被17除余15,最后得到一个商是a的2倍。编写程序求这个自然数。参考答案: void main(){ int i,n,a; for(i=0; ;i++){ if(i%8==1){ n=i/8; if(n%8==1){ n=n/8; if(n%8==7)a=n/8; } } if(i%17==4){ n=i/17; if(n%17==15)n=n/17; } if(2*a==n){ printf(“result=%dn”,i); break; } } } 6、编写程序,输出用一元人民币兑换成1分、2分和5分硬币的不同兑换方法。参考答案: void main(){ int f1,f2,f5,count=0; for(f5=0;f5<=20;f5++)for(f2=0;f2<=(100-f5*5)/2;f2++){ f1=100-f5*5-f2*2; if(f5*5+f2*2+f1==100)printf(“No.%2d >> 5: %4d 2: %2d 1: %2dn”,++count,f5,f2,f1); } } 7、将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为对称数。求不超过1993的最大的二进制的对称数。参考答案: void main(){ int i,j,n,k,a[16]={0}; for(i=1;i<=1993;i++){ n=i;k=0; while(n>0)/* 将十进制数转变为二进制数 */ { a[k++]=n%2; n=n/2; } for(j=0;j 8、十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14 块,第十个小孩20块。然后所有的小孩同时将自己手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次调整后大家手中的糖的块数都一样?每人各有多少块糖? 参考答案: void main(){ int i,count=0,a[11]={0,10,2,8,22,16,4,10,6,14,20}; while(1){ for(i=1;i<=10;i++)a[i-1]=a[i-1]/2+a[i]/2; a[10]=a[10]/2+a[0]; for(i=1;i<=10;i++)if(a[i]%2==1)a[i]++; for(i=1;i<10;i++)if(a[i]!=a[i+1])break; if(i==10)break; else { a[0]=0; count++; } } printf(“count=%d number=%dn”,count,a[1]); } 9、输入5×5的数组,编写程序实现:(1)求出对角线上各元素的和; (2)求出对角线上行、列下标均为偶数的各元素的积;(3)找出对角线上其值最大的元素和它在数组中的位置。参考答案: void main(){ int i,j,s1=0,s2=1,a[5][5]; for(i=0;i<5;i++)for(j=0;j<5;j++){ printf(“%d %d: ”,i,j); scanf(“%d”,&a[i][j]); } for(i=0;i<5;i++){ for(j=0;j<5;j++)printf(“%5d”,a[i][j]); printf(“n”); } j=0; for(i=0;i<5;i++){ s1=s1+a[i][i]; if(i%2==0)s2=s2*a[i][i]; if(a[i][i]>a[j][j])j=i; } printf(“SUN=%dnACCOM=%dna[%d]=%dn”,s1,s2,j,a[j][j]); } 10、编写程序,以字符形式输入一个十六进制数,将其变换为一个十进制整数后输出。参考答案: #include “stdio.h” void main(){ int i,n=0,a[4]={0}; printf(“Please enter a digit:”); for(i=0;i<4 &&(a[i]=getchar())!='n';i++); for(i=0;i<4;i++)if(a[i]>=48&&a[i]<=57)a[i]=a[i]-48; else if(a[i]>=65&&a[i]<=69)a[i]=a[i]-55; else if(a[i]>=97&&a[i]<=102)a[i]=a[i]-87; else printf(“input Error!”); for(i=0;i<4;i++)n=n*16+a[i]; printf(“%d”,n); } 11、编写程序,输入一个十进制整数,将其变换为二进制后储存在一个字符数组中。参考答案: void main(){ int i,n,k=16,a[16]={0}; printf(“Please enter a digit:”); scanf(“%d”,&n); while(n>0)/* 将十进制数转变为二进制数 */ { a[--k]=n%2; n=n/2; } for(i=0;i<16;i++)printf(“%2d”,a[i]); } 12、对数组A中的N(0<N<100=个整数从小到大进行连续编号,输出各个元素的编号。要求不能改变数组A中元素的顺序,且相同的整数要具有相同的编号。例如数组是:A=(5,3,4,7,3,5,6)则输出为:(3,1,2,5,1,3,4)参考答案: void main(){ int i,j,k,n,m=1,r=1,a[2][100]={0}; printf(“Please enter n:”); scanf(“%d”,&n); for(i=0;i for(j=i;j 13、求这样一个三位数,该三位数等于其每位数字的阶乘之和。 即: abc = a!+ b!+ c!参考答案: void main(){ int a[5],i,t,k; for(i=100;i<1000;i++){ for(t=0,k=1000;k>=10;t++){ a[t]=(i%k)/(k/10); k/=10; } if(f(a[0])+f(a[1])+f(a[2])==i)printf(“%d ”,i); } } f(m)int m; { int i=0,t=1; while(++i<=m)t*=i; return(t); } 14、编写一个函数实现将字符串str1和字符串str2合并,合并后的字符串按其ASCII码值从小到大进行排序,相同的字符在新字符串中只出现一次。参考答案: #include “string.h” strcmbn(a,b,c)/* 数组合并函数:将数组a、b合并到 */ char a[],b[],c[]; { char tmp; int i,j,k,m,n; m=strlen(a); n=strlen(b); for(i=0;i tmp=a[i]; a[i]=a[k]; a[k]=tmp; } for(i=0;i tmp=b[i]; b[i]=b[k]; b[k]=tmp; } i=0;j=0;k=0; while(i第二篇:C语言程序设计习题试题(编程题)