山科大C语言程序设计编程精选44例.doc_第1页
山科大C语言程序设计编程精选44例.doc_第2页
山科大C语言程序设计编程精选44例.doc_第3页
山科大C语言程序设计编程精选44例.doc_第4页
山科大C语言程序设计编程精选44例.doc_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

问题 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); 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提示难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。解答:#includeint main()int k,m,n,i,a;scanf(%d%d%d,&k,&m,&n);if(m=n)a=n;elsea=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();elseprintf( %d,i);问题 3: A+B Problem题目描述计算a+b,0=a,b1000。输入输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。输出每行输出一个a+b的值,顺序与输入对应。样例输入1 210 20样例输出330提示OJ系统上测试输入结束符为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的和,顺序与输入对应。样例输入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 210 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提示由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。解答:#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个数中最大的数和最小的数。输出输出为两行,格式见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);printf(The minimum number is %d.,min);问题 8: 成绩的等级题目描述把百分制的考试成绩转换成五级制的成绩:90100:Excellent8089:Good7079:Average6069:Pass059:Failing不在0100之间的输入是非法数据,输出“Error”。输入输入多行,每行一个整数。输出输入所对应的成绩等级。样例输入-18192356872100样例输出ErrorGoodExcellentFailingPassAverageExcellent提示用switch语句解决这个问题比较方便。解答:#includeint main()int 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: 只有一个二元运算符的表达式运算题目描述编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与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#includevoid 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(invalid 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-)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样例输出 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 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 - 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!=?,并判断是否溢出。输入输入为一个正整数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(%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(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 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解答:#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: 产生等差序列之二题目描述根据给出的初始数、公差和终止条件求等差序列。输入输入为一行,格式见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 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(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),余数是147: 1071 = 2 462 + 147.然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21: 462 = 3 147 + 21.再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数: 147 = 7 21 + 0.此时,余数是0,所以1071和462的最大公约数是21。输入输入为多行,每行有一对非负整数a,b,且a*b不会超出int类型的数据范围。输入至EOF结束。输出每行输出一对a,b的最大公约数和最小公倍数,顺序与输入对应。样例输入1 12 32 23 24 67 512 618 924 36样例输出1 11 62 21 62 121 356 129 1812 72提示按照题目描述所给的算法解题,注意以下几点:辗转相除法对两个数的大小关系有要求,根据倍数和约数的数学定义,一个非0数和0的约数是多少?辗转相除法的计算过程是符合这种定义的。解答:#includeint main()int a,b,i,c;for(;scanf(%d%d,&a,&b)!=-1;)c=a*b;if(a=0&b!=0)printf(%d %dn,b,a);else if(a!=0&b=0)printf(%d %dn,a,b);elsewhile(a!=b)if(ab)a=a-b;if(ab)b=b-a;printf(%d %dn,a,c/a);问题 17: Sum Problem题目描述计算若干整数的和,这些整数都是小于1000的非负整数。输入输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。输出每组测试样例对应一行输出,输出所给的N个整数之和,顺序与输入对应。样例输入3 1 2 35 10 15 20 30 50样例输出6125提示用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。解答:#includeint main()int n,a,i,s;for(;scanf(%d,&n)!=-1;)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个整数之和,顺序与输入对应。样例输入23 1 2 35 10 15 20 30 50样例输出6125提示用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。解答:#includeint main()int m,n,a,i,j,s;scanf(%d,&m);for(j=1;j=m;j+)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个整数之和,顺序与输入对应。样例输入3 1 2 35 10 15 20 30 500样例输出6125提示用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。解答:#includeint main()int n,a,i,s;for(;scanf(%d,&n);)if(n=0)break;elses=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个整数之和,顺序与输入对应。两样例的输出之间用一个空行分隔开。样例输入23 1 2 35 10 15 20 30 50样例输出6125提示用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。解答:#includeint main()int m,n,a,i,j,s;scanf(%d,&m);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时表示输入结束。输出输出为多行,每行对应一个输入数字的序数表示。样例输入1 2 3 4 5 10 11 12 13 14 0样例输出1st 2nd 3rd 4th 5th 10th 11st 12nd 13rd 14th 提示用if语句似乎更容易些。解答:#includeint main()int a;for(;scanf(%d,&a);)if(a=0)break;elseif(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的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。样例输入3 1 2 35 10 15 20 30 504 100 200 300 400样例输出11 17 23 30 50100 200 300 400提示这里最少要用到一个数组来存数整数序列或整数序列的和。解答:#include int main()int a1000=0,b1000=0;int m,i,j=0,p,k;while(scanf(%d,&m)!=EOF) j+;if(j%2!=0)for(i=0;im;i+)scanf(%d,&ai);else for(p=0;pm;p+)scanf(%d,&bp);if(j%2!=1)if(i=p) for(k=0;kp;k+) if(k=0) printf(%d,ak+bk); ak=0; bk=0; else printf( %d,ak+bk); ak=0; bk=0; printf(n); else for(k=0;ki;k+) if(k=0) printf(%d,ak+bk); ak=0; bk=0; else printf( %d,ak+bk); ak=0; bk=0; printf(n);if(m!=0&j%2=1)for(i=0;i0),后面有M行输入。每行输入为不超过1000个整数的整数序列,每个整数序列的输入均以0结束。输出对输入的整数序列两两相加:第1行和第2行相加、第3行和第4行相加按顺序输出结果:每行输出一个整数序列,每两个整数之间用一个空格分隔。若序列数目不为偶数,则视作补一个长度为0的整数序列相加。值得注意的是一个长度为0的整数序列也应该有输出,即使没有整数输出,也应该占有一行,因为“每行输出一个整数序列”。样例输入31 2 3 010 15 20 30 50 0100 200 300 400 0样例输出11 17 23 30 50100 200 300 400提示这里最少要用到一个数组来存数整数序列或整数序列的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论