1、山科大 C语言程序设计编程精选44例问题 1: 三个数比较大小题目描述从键盘上输入0100之间的三个数,按从小到大的顺序输出。输入输入只有一行,为三个整数。输出按从小到大输出这三个数。样例输入15 10 20样例输出10 15 20提示用if语句判断各种情况可以解决这个问题。解答:#includeint main() 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);
2、 else if(bc) printf(%d %d %d,a,b,c); else if(ac) printf(%d %d %d,a,c,b); else printf(%d %d %d,c,a,b); 问题 2: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数题目描述输出1k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1=m,nk100。输入输入三个整数,依次为k、m、 n。输出从小到大输出符合题意的所有整数,两数之间用一个空格分开。样例输入15 2 3样例输出2 3 4 8 9 10 14 15提示难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。解答
3、:#includeint main() int k,m,n,i,a; scanf(%d%d%d,&k,&m,&n); if(m=n) 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,b1000。输入输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。输出每行输出一个a+b的值,顺序与输入对应。样例输入1 210 20样例输出330提示OJ系统上测试输入结束
4、符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。解答:#includeint main() int a,b; for(;scanf(%d%d,&a,&b)!=EOF;) printf(%dn,a+b);问题 4: A+B Problem (II) : Input/Output Pratice题目描述计算a+b,0=a,b1000。输入输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。输出每行输出一个a+b的和,顺序与输入对
5、应。样例输入21 210 20样例输出330提示N给出了测试样例数,用for循环处理方便。解答:#includeint main() int n,a,b,i; scanf(%d,&n); for(i=1;i=n;i+) scanf(%d%d,&a,&b); printf(%dn,a+b); 问题 5: A+B Problem (III) : Input/Output Pratice题目描述计算a+b,0=a,b1000。输入输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。输出每行输出一个a+b的值,顺序与输入对应。样例输入1 21
6、0 200 0样例输出330提示练习break的使用。解答:#includeint main() int a,b; for(;scanf(%d%d,&a,&b);) if(a=0&b=0) break; printf(%dn,a+b); 问题 6: A+B Problem (IV) : Input/Output Pratice题目描述计算a+b,0=a,b1000。输入输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。输出每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。样例输入1 210 2015 35样例输出33050提示由于输出的和比空行多一个,所以全
7、部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。解答:#includeint main() int i,a,b; i=1; scanf(%d%d,&a,&b); printf(%dn,a+b); i+; for(;scanf(%d%d,&a,&b)!=-1;) printf(n%dn,a+b); 问题 7: n个数的最大值和最小值问题描述找出n个数中最大的数和最小的数,并将它们的值输出出来。输入输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。输出输
8、出为两行,格式见sample。样例输入3 0 1 -1样例输出The maximum number is 1.The minimum number is -1.提示分隔符是空格还是回车都是空白符,对scanf(%d)来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。解答:#includeint main() int a,n,i,min,max; scanf(%d,&n); scanf(%d,&a); min=a; max=a; for(i=1;imax) max=a; if(amin) min=a; printf(The maximum number is %d.n,max
9、);printf(The minimum number is %d.,min);问题 8: 成绩的等级题目描述把百分制的考试成绩转换成五级制的成绩:90100:Excellent8089:Good7079:Average6069:Pass059:Failing不在0100之间的输入是非法数据,输出“Error”。输入输入多行,每行一个整数。输出输入所对应的成绩等级。样例输入-18192356872100样例输出ErrorGoodExcellentFailingPassAverageExcellent提示用switch语句解决这个问题比较方便。解答:#includeint main() int
10、a; for(;scanf(%d,&a)!=-1;) if(a100) 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: 只有一个二元运算符的表达式运算题目描述编程序读入
11、并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。输入每行输入一个表达式,格式为:二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。测试样例不存在除数为0的情况。输入以a和b为0,且用一个空格分开结束。输出每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalid op”。样例输入33+58*92.21-617/39%30 0样例输出3872invalid op-550提示教材上有非常相似的例题可以参考。#include#include
12、void main() int i,a,b; char c; for(i=0;i=100;i+) for(;scanf(%d%c%d,&a,&c,&b)!=EOF;) 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(inv
13、alid opn); loop: i=101;问题 10: 求100以内的素数题目描述素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。输入输入为两个整数m和n,满足0=m=n=100。输出从大到小输出mn之间的所有素数,一个素数一行。如果mn之间没有素数,则不输出任何数。输出的所有数在两行“=”之间。样例输入2 12样例输出=117532=提示利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。解答:#includeint main() int a,b,i,q,j; scanf(%d%d,&a,&b); printf(=n); for(j=b;j=a;j-
14、) q=0; for(i=2;iF”表示输出:摄氏华氏温度转换表,若为“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-10402.5样例输
15、出 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分析出来,因为两栏的总宽度是固定的。一个隐藏的陷阱是st
16、ep是浮点数,某些浮点数是无法精确存储的,因此经过一定量的计算后这个误差会影响到浮点数的相等性判断,需要加上精度控制。解答:#include int main() 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 F); while(low %6.1lf,low,f); low+=step; return 0; printf( C
17、 - F); while(low %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 C); while(low %6.1lf,low,c); low+=step; return 0; printf( F - C); while(low %5.1lf,low,c); low+=step; return 0; 问题 12: 1!+2!+k!=?题目描述求1!+2!+k!=?,并判断是否溢出
18、。输入输入为一个正整数k。输出若1!+2!+k!的值溢出unsigned(无符号整型)的范围输出“overflow”,否则输出1!+2!+k!的结果。样例输入5样例输出153提示如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么?解答:#include int main() 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/ai) printf(overflown); return 0; s=s+b; printf(%
19、un,s); return 0;问题 13: 输出整数的最低两位题目描述把一个整数的最低两位打印出来,不输出整数的符号。输入输入为一个整数n,不会超出int类型的数据范围。输出输出n的最低两位数字。但是,输入的数字本身不足两位时,不应当补0。如,输入为“1”,则输出为“1”。样例输入-102样例输出02提示printf函数可以完成补0的操作。解答:#includeint main() int a,b,c; scanf(%d,&a); if(a0) c=-a; if(c100) printf(%d,c); else b=c-100*(c/100); printf(%.2d,b); else if
20、(a0,step不为0。输出把这个等差序列输出在一行里,序列两数之间用一个空格分隔。样例输入start = 1, step = 2, times = 100样例输出1 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 1
21、37 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解答:#includeint main() int st,s,t,i; scanf(start = %d, step = %d, times = %d,&st,&s,&t); printf(%d,st); for(i=1;it;i+) st=st+s; printf( %d,st); 问题 15: 产生等差序列之二题目描述根据给出的初始数、公差和
22、终止条件求等差序列。输入输入为一行,格式见sample。其中,start为初始数,step为公差,end为终止条件。满足,step不为0,并且start和end的大小关系与step的方向一致。end不一定是序列的最后一个数。输出把这个等差序列输出在一行里,序列两数之间用一个空格分隔。样例输入start = 1, step = 2, end = 200样例输出1 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
23、 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的大小关系,判断序列终止的条件可能不同。解答:#includeint main() int st,s,end; scanf(
24、start = %d, step = %d, end = %d,&st,&s,&end); printf(%d,st); if(s0) 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),余数是1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1