(1-2)
Description
计算两整数x和y(0 Input 输入只有一行,格式见sample。 Output 输出为多行,按顺序每行输出x,y的和、差、积、商、余数、x的平方和y的三次方,格式见sample Sample Input x = 11, y = 3 Sample Output x + y : 14 x - y : 8 x * y : 33 x / y quotient: 3, remainder: 2 x ^ 2 : 121 y ^ 3 : 27 HINT 注意输入输出格式。了解C语言整数除法运算符的特点,并且没有求幂的运算符 #include int main() { int x,y; 0 scanf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ return 0; } (1-3) Description 从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。 Input 输入一个浮点型数据,有效数字不会超过十进制的6位。 Output 输出为两行。 第一行为圆的面积,第二行为圆的周长,格式见sample。 Sample Input 3 Sample Output Area: 28.260000 Perimeter: 18.840000 HINT 了解浮点类型的输入、输出和算术运算符 #include float r,s,c; scanf(\ s=P*r*r; c=2*r*P; printf(\ printf(\ return 0; } (1-4) Description 求3个数的平均值。 Input 输入只有一行,为3个较小的整数。 Output 输出为这3个整数的平均值,保留3位小数。 Sample Input 1 2 3 Sample Output 2.000 HINT 注意除法运算对整型数据和浮点型数据是不一样的 #include int a,b,c; float Aver; scanf(\ Aver=(a+b+c)/3.0; printf(\ return 0; } (1-5) Description 给出人民币对美元、欧元、日元的当日汇率,求给定金额的人民币能兑换成外币的金额,求给定金额的外币能兑换成人民币的金额。 要计算的外币有三种:美元、欧元、日元。 Input 输入有三行。 第一行依次为美元、欧元、日元外币汇率,用空格分开。汇率用100外币为单位,精确到小数点后4位,如668.5200表示“100美元=668.5200人民币”。汇率浮动范围为(0,10000)。 第二行为外币金额x,第三行为人民币金额y。x,y均为整数,且0 Output 输出为两行。 第一行为金额为x的美元、欧元、日元兑换成人民币的金额,用空格分开。 第二行为金额为y的人民币兑换成美元、欧元、日元的金额,用空格分开。 所有金额精确到小数点后两位。 Sample Input 668.5200 908.0685 7.9852 1500 1500 Sample Output 10027.80 13621.03 119.78 224.38 165.19 18784.75 HINT 了解浮点数据类型的精确度和输出控制。 #include double x,y; double a,b,c,i,j,k,l,m,n; scanf(\ scanf(\ scanf(\ i=x/100*a; j=x/100*b; k=x/100*c; l=y/a*100; m=y/b*100; n=y/c*100; printf(\ printf(\ return 0; } (1-6) Problem F: 求字符的值 Time Limit: 1 Sec Memory Limit: 2 MB Submit: 562 Solved: 373 [Submit][Status][Web Board] Description 从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。 Input 输入为3个字符。 Output 输出为3行。 每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。每个输出的值占3个字符,不足3个字符前面补0。 Sample Input 0 A Sample Output 048 060 030 032 040 020 065 101 041 HINT 了解字符值的存储和整型的关系。 #include char a,b,c; scanf(\ printf(\ printf(\ printf(\ return 0; } (1-7) Problem G: 奇数还是偶数? Time Limit: 1 Sec Memory Limit: 2 MB Submit: 575 Solved: 455 [Submit][Status][Web Board] Description 输入一个整数,判读它是奇数还是偶数。 Input 输入只有一行,为一个100以内的正整数。 Output 输出为一行。 若输入为偶数则输出“even”,奇数输出“odd”。 Sample Input 30 Sample Output even HINT 用整数运算可以解决,练习“?:”表达式。 #include int a; (0 printf(\ else printf(\ return 0; } (1-8) Problem H: 绝对值 Time Limit: 1 Sec Memory Limit: 2 MB Submit: 840 Solved: 376 [Submit][Status][Web Board] Description 求整型数据和浮点型数据的绝对值。 Input 输入两个数,第一个是整数,第二个是浮点数。 Output 输出为两行,第一行为整数的绝对值,第二行为浮点数的绝对值,注意浮点数的绝对值不输出无意义的0。 Sample Input -1 1 Sample Output 1 1 HINT 求绝对值可以用标准库函数来完成,也可以自己判断。注意浮点数的输出格式。求绝对值的函数在哪个头文件?貌似很多人会搞错,包括很多编书的人! #include int a,c; double b,d; scanf(\ c=abs(a); d=fabs(b); printf(\ return 0; } (1-9) Problem I: 简单的打折计算 Time Limit: 1 Sec Memory Limit: 2 MB Submit: 919 Solved: 435 [Submit][Status][Web Board] Description 商店规定:消费满n元,可以打八八折。设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:元),精确到分。 Input 输入只有一行,三个整数m、n和x,且0 Output 输出金额,精确到分。 Sample Input 95 300 4 Sample Output 334.40 HINT 了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。 #include int m,x,n,a; float b; scanf(\ 0 m b=0.88*a; else b=a; printf(\ return 0; } (1-10) Problem J: 判断闰年 Time Limit: 1 Sec Memory Limit: 2 MB Submit: 939 Solved: 443 [Submit][Status][Web Board] Description 输入一个正整数的年份,判断是否为闰年。 Input 输入只有一行,为一个10000以内的正整数。 Output 输出为一行。 若输入为闰年偶数则输出“Yes”,否则输出“No”。 Sample Input 2010 Sample Output No HINT 了解逻辑运算符和关系运算符。 #include int a; 0 if (a%4==0&&a0!=0) printf(\ else if (a@0==0) printf(\ else printf(\ return 0; } (1-11) Description GHacker最近痴迷于一个新上市的解谜游戏,其中一关的过关是破解一个字符串S。经过3天的冥思苦想,GHacker成功的搞明白了这其中的奥秘,把串S中的整数取出来求和,就可以过关了。但是GHacker的数学实在糟糕。他无法在短暂的时间内算出来,只好求助Jackie。Jackie观察到虽然每次出现的数字不同,但是其它的符号并不会变化。于是Jackie编写了一个非常短的程序,帮助GHacker把这一关过了。 Input 输入为串S,只有一行。 Output 串S中用非数字(0~9)分隔开的非负整数之和,不会超出int类型的数据范围。 Sample Input `13?:[7514],54.487==\Sample Output 447899 HINT scanf()可以解决这个问题,注意转义字符和格式控制字符。 #include { int a,b,c,d,e,f,g,h,i,j,k,s; scanf(\%*c%d%*c%*c%d%*c%*c%*c%*c%d%*c%d%*c\ s=a+b+c+d+e+f+g+h+i+j+k; printf(\ return 0; } (1-12) Problem L: 水仙花数 Time Limit: 1 Sec Memory Limit: 2 MB Submit: 960 Solved: 534 [Submit][Status][Web Board] Description 如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。如:13+53+33=153。 Input 一个整数x,100<=x<=999。 Output x是水仙花数,则输出“YES”,否则为“NO”。 Sample Input 153 Sample Output YES 答案: #include int a,b,c,d,e; scanf(\ b=a/100; c=(a-b*100)/10; d=(a-b*100-c*10); e=b*b*b+c*c*c+d*d*d; if(a==e) printf(\ else printf(\ return 0; } (1-13) Problem M: 求1+2+...+n=? Time Limit: 1 Sec Memory Limit: 2 MB Submit: 2023 Solved: 413 [Submit][Status][Web Board] Description 给定一个n,求出s = 1+2+3+...+n的值。 Input 输入只有一行,包含一个正整数n(n<=232)。 Output 输出一行,为1+2+...+n的值。 Sample Input 10 Sample Output 55 HINT n的数据范围大,需注意数据类型的选择和计算次序,以避免数据溢出。 #include unsigned long long n; scanf(\ if(n%2==0) printf(\ else printf(\ return 0; } (1-14) Problem N: 2的多少次幂 Time Limit: 1 Sec Memory Limit: 2 MB Submit: 1022 Solved: 470 [Submit][Status][Web Board] Description 从键盘输入一个数x,x是2的整数次幂(x=2y),请编程求出y的值。 Input 一个非负有理数x,x在[0,2256]范围内。 Output 一个整数y。 Sample Input 1 Sample Output 0 HINT 看起来数据很大,但是用double完全可以存储。为什么?请研究下IEEE-754标准的浮点数存储格式。这里要用到C语言标准库的数学函数。 #include double x; int y; scanf(\ y=log2(x); printf(\ return 0; } 第二次作业 (2_1)问题 A: 哪一行比较长 时间限制: 1 Sec 内存限制: 2 MB 提交: 625 解决: 252 [提交][状态][讨论版] 题目描述 读取两行字符串,按每行的长度从长到短输出。 输入 输入为两行,每行不会超过26个字符。 输出 输出为两行,按每行的长度从长到短输出。 样例输入 abcdefghijk abcdefghijklmnopqrstuvwxyz 样例输出 abcdefghijklmnopqrstuvwxyz abcdefghijk 提示 了解字符串的存储和操作,了解gets()和scanf(\读入字符串的不同之处 #include char s1[27],s2[27]; int a,b; gets(s1); gets(s2); a=strlen(s1); b=strlen(s2); if (a>=b) { puts(s1); puts(s2); } else { puts(s2); puts(s1); } return 0; } (2_2 )> 题目描述 从键盘上输入0~100之间的三个数,按从小到大的顺序输出。 输入 输入只有一行,为三个整数。 输出 按从小到大输出这三个数。 样例输入 15 10 20 样例输出 10 15 20 提示 用if语句判断各种情况可以解决这个问题。 #include int a,b,c; scanf(\ if (a>=b&&b>=c) printf(\ else if (a>=c&&c>=b) printf(\ else if (b>=c&&c>=a) printf(\ else if (b>=a&&a>=c) printf(\ else if (c>=b&&b>=a) printf(\ else printf(\ return 0; } Append Code (2_3) 题目描述 输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n 输入三个整数,依次为k、m、 n。 输出 从小到大输出符合题意的所有整数,两数之间用一个空格分开。 样例输入 15 2 3 样例输出 2 3 4 8 9 10 14 15 提示 难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。 #include int k,m,n,a,b,i,c,d; scanf(\ if (m>n) c=m,d=n; else c=n,d=m; printf(\ for (i=d+1;i<=k;i++) { a=i%m; b=i%n; if (a==0&&b!=0||a!=0&&b==0) printf(\ } printf(\ return 0; } (2_4)Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的值,顺序与输入对应。 Sample Input 1 2 10 20 Sample Output 3 30 HINT OJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。 #include int a,b; while(scanf(\ printf(\ return 0; } Append Code (2_5)问题 E: A+B Problem (II) : Input/Output Pratice 时间限制: 1 Sec 内存限制: 2 MB 提交: 242 解决: 177 [提交][状态][讨论版] 题目描述 计算a+b,0<=a,b<1000。 输入 输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。 输出 每行输出一个a+b的和,顺序与输入对应。 样例输入 2 1 2 10 20 样例输出 3 30 提示 #include int a[1000],b[1000],N,i; scanf(\ for (i=1;i<=N;i++) scanf(\ for (i=1;i<=N;i++) printf(\ return 0; } N给出了测试样例数,用for循环处理方便。 (2_6)问题 F: A+B Problem (III) : Input/Output Pratice 时间限制: 1 Sec 内存限制: 2 MB 提交: 250 解决: 154 [提交][状态][讨论版] 题目描述 计算a+b,0<=a,b<1000。 输入 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。 输出 每行输出一个a+b的值,顺序与输入对应。 样例输入 1 2 10 20 0 0 样例输出 3 30 提示 练习break的使用。 #include int a,b,sum; while (scanf(\ { if (a==0&&b==0) break; else { sum=a+b; printf(\ } } return 0; } (2_7)问题 G: A+B Problem (IV) : Input/Output Pratice 时间限制: 1 Sec 内存限制: 2 MB 提交: 284 解决: 151 [提交][状态][讨论版] 题目描述 计算a+b,0<=a,b<1000。 输入 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 输出 每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。 样例输入 1 2 10 20 15 35 样例输出 3 30 50 提示 由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。 #include printf(\ } } (2_8)问题 H: n个数的最大值和最小值 时间限制: 1 Sec 内存限制: 2 MB 提交: 304 解决: 159 [提交][状态][讨论版] 题目描述 找出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(\来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。 #include int b,d,n,i,max,min; scanf(\ scanf(\ max=d; min=d; for (i=2;i<=n;i++) { scanf(\ if (b>=max) max=b; if (b<=min) min=b; } printf(\ printf(\ return 0; } (2_9)问题 I: 成绩的等级 时间限制: 1 Sec 内存限制: 2 MB 提交: 425 解决: 153 [提交][状态][讨论版] 题目描述 把百分制的考试成绩转换成五级制的成绩: 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 { int score; while(scanf(\ { if (score<0||score>100) printf(\ else { switch (score/10) { case 0: case 1: case 2: case 3: case 4: case 5: printf(\ case 6: printf(\ case 7: printf(\ case 8: printf(\ case 9: case 10: printf(\ } } } return 0; } (2_10)问题 J: 只有一个二元运算符的表达式运算 时间限制: 1 Sec 内存限制: 2 MB 提交: 334 解决: 138 [提交][状态][讨论版] 题目描述 编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与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 样例输出 38 72 invalid op -5 5 0 提示 教材上有非常相似的例题可以参考。 #include int a,b; char c; while (scanf(\ { if (a==0&&c==32&&b==0) break; else { switch(c) { case '+': printf(\ break; case '-': printf(\ break; case '*': printf(\ break; case '/': printf(\ break; case '%': printf(\ break; default : printf(\ break; } } return 0; } (2_11)问题 K: 求100以内的素数 时间限制: 1 Sec 内存限制: 2 MB 提交: 612 解决: 197 [提交][状态][讨论版] 题目描述 素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。 输入 输入为两个整数m和n,满足0<=m<=n<=100。 输出 从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。 输出的所有数在两行“=====”之间。 样例输入 2 12 样例输出 ===== 11 7 5 3 2 ===== 提示 利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关 (2_12)问题 L: 摄氏——华氏温度转换表 时间限制: 1 Sec 内存限制: 2 MB 提交: 568 解决: 132 [提交][状态][讨论版] 题目描述 已知华氏温度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 z,C,F,i,m,n; char a,b,c,d; scanf(\ scanf(\ scanf(\ scanf(\ if(a=='C') { printf(\ C -> F\\n\ for(i=m;i<=n+0.01;i=i+z) { F=9*i/5+32; printf(\ } } else if(a=='F') { printf(\ F -> C\\n\ for(i=m;i<=n+0.01;i=i+z) { C=(i-32)*5/9; printf(\ } } return 0; } (2_13)问题 M: 1!+2!+?+k!=? 时间限制: 1 Sec 内存限制: 2 MB 提交: 758 解决: 205 [提交][状态][讨论版] 题目描述 求1!+2!+?+k!=?,并判断是否溢出。 输入 输入为一个正整数k。 输出 若1!+2!+?+k!的值溢出unsigned(无符号整型)的范围输出“overflow”,否则输出1!+2!+?+k!的结果。 样例输入 5 样例输出 153 提示 如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么? #include int k,i,j; unsigned int sum=0,a=1; scanf(\ if(k<=12) { for(i=1;i<=k;i++) { for(j=i;j>=1;j--) a=a*j; sum=sum+a; a=1; } printf(\ } else printf(\ return 0; } 第三次作业 (3-1)A Description 给出一个十进制的非负整数x,x<=216,把它转换成二进制数输出。 Input 输入为多行,每行一个整数x,至读入EOF结束。 Output 每行输出x对应的二进制数值。 Sample Input 0 1 3 33 65535 Sample Output 0 1 11 100001 1111111111111111 HINT 本题有多种解法:可以用循环迭代对2的除法和取余操作,不过处理的顺序与输出顺序相反,需要利用数组存储;用取对数或从大到小减去2的整数次幂的方法计算与输出顺序是相同的;也可以用printf()把十进制的数值处理成十六进制,然后1位十六进制转4位二进制;也可以用位运算处理。 #include int a[20],i,b; while(scanf(\ { for(i=0;;i++) { a[i]=b%2; b=b/2; if(b==0) break; } for(;i>=0;i--) printf(\ printf(\ } return 0; } (3-2)B Description 一元二次方程的标准形式为ax2+bx+c=0(a≠0),其中a、b、c为常数。求解一元二次方程的根x时有三种情况,分别为(记Δ=b2-4ac): 1. Δ>0,有两个不等的实根; 2. Δ=0,有两个相同的实根; 3. Δ<0,有两个共轭的虚根。 Input 输入为多行,每行为一元二次方程的三个常数a,b,c,在double类型范围之内。当输入的a 为0时,表示输入结束。 Output 每行输入的样例对应三行输出。 第一行输出为样例的编号。第二行输出为所输入常数a,b,c对应的一元二次方程的标准形式,要求输出满足a>0。第三行输出为所输入方程的根,分为三种情况:1. 若方程满足Δ>0,即有两不等实根x1、x2,则按大小顺序输出这两个实根。2. 若方程满足Δ=0,即有两相同实根x,则输出一个实根。3. 若方程满足Δ<0,即有两共轭的虚根x1、x2,则输出两个虚根,虚部符号为正的(即u+vi形式)先输出,虚部符号为负的(x-yi形式)后输出。 以上输出均不输出数学上无意义或可省略的的符号,所有数值最多保留6位有效数字。每个样例之后都有一个空行分隔。 Sample Input 1 2 1 -1 2 -1 -5 2 -0.2 -3 2 0 3 0 12 2 4 4 0 Sample Output Case 1 : x^2 + 2x + 1 = 0 only one real root : -1 Case 2 : x^2 - 2x + 1 = 0 only one real root : 1 Case 3 : 5x^2 - 2x + 0.2 = 0 only one real root : 0.2 Case 4 : 3x^2 - 2x = 0 two real roots : 0, 0.666667 Case 5 : 3x^2 + 12 = 0 two imaginary roots : 2i, -2i Case 6 : 2x^2 + 4x + 4 = 0 two imaginary roots : -1+i, -1-i HINT 输出方程格式的各种情况要想清楚,这一部分测试数据给的很全面。另一个就是浮点数的精度控制,这一部分sample给出了例子。 值得注意的是,linux下gcc编译的浮点数运算结果有-0,这是OJ系统Judge端使用的系统;而windows XP下的minGW编译器和VC6不会产生-0,只会输出0;但windows 7下的minGW编译器是能够产生-0的(确实很诡异)。因此使用windows XP的同学忽略了对结果为0的检测,程序需要对结果为0的情况进行全面考虑,确保正确的输出0。这个问题卡了好些同学好几天。 关于是否会产生-0,输出表达式0.0/-1的结果就能测试出来。浮点数从负数方向运算出结果为0,则浮点值为-0是符合C语言浮点数运算规则的,目前尚不清楚windows XP系统不能产生-0的原因。 #include double a,b,c,d,m,x1,x2,t,s; int i=1; while(scanf(\{ if(a==0) break; if(a!=0) {scanf(\if(a<0){a=-a;b=-b;c=-c;} printf(\i++; if(a==1) printf(\ else printf(\if(b==0) ; else if(b==1) printf(\ else if(b==-1) printf(\ else printf(\if(c==0); else printf(\printf(\m=b*b-4*a*c; d=sqrt(m); if(m>1e-12) {x1=(-b-d)/(2*a); x2=(-b+d)/(2*a); if(fabs(x1)<1e-6) x1=0; if(fabs(x2)<1e-6) x2=0; printf(\} else if(fabs(m)<1e-12) {x1=-b/(2*a); if(fabs(x1)<1e-6) x1=0; printf(\if(x1==0) printf(\else printf(\else {t=(-b)/(2*a); s=sqrt(4*a*c-b*b)/(2*a); if(fabs(t)<1e-6) t=0; if(fabs(s)<1e-6) s=0; printf(\if(t==0) ; else printf(\if(t==0) { if(s==1) printf(\else printf(\} else { if(s==1) printf(\else printf(\} printf(\ if(t!=0)printf(\if(s!=1) printf(\else printf(\} printf(\ } } return 0; } (3-3)C Description 辗转相除法,也称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第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。 Input 输入为多行,每行有一对非负整数a,b,且a*b不会超出int类型的数据范围。输入至EOF结束。 Output 每行输出一对a,b的最大公约数和最小公倍数,顺序与输入对应。 Sample Input 1 1 2 3 2 2 3 2 4 6 7 5 12 6 18 9 24 36 Sample Output 1 1 1 6 2 2 1 6 2 12 1 35 6 12 9 18 12 72 HINT 按照题目描述所给的算法解题,注意以下几点:辗转相除法对两个数的大小关系有要求,根据倍数和约数的数学定义,一个非0数和0的约数是多少?辗转相除法的计算过程是符合这种定义的。 #include unsigned int a,b,m,n,p; while(scanf(\ { if(m>=n) { a=m;b=n; } else { a=n; b=m; } if(b==0) { printf(\ } if(a!=0&&b!=0) { while(a%b!=0) { p=a%b; a=b; b=p; } if(a%b==0) printf(\ } } return 0; } (3-4)D Description 计算若干整数的和,这些整数都是小于1000的非负整数。 Input 输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。 Output 每组测试样例对应一行输出,输出所给的N个整数之和,顺序与输入对应。 Sample Input 3 1 2 3 5 10 15 20 30 50 Sample Output 6 125 HINT 用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 #include unsigned int n,a,i,sum; while(scanf(\ { sum=0; for(i=1;i<=n;i++) { scanf(\ sum+=a; } printf(\ } return 0; } (3-5)E Description 计算若干整数的和,这些整数都是小于1000的非负整数。 Input 输入的第一行是一个整数M,后面有M个测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。 Output 每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。 Sample Input 2 3 1 2 3 5 10 15 20 30 50 Sample Output 6 125 HINT 用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 #include int M,N,a,i,j,sum; scanf(\ for(j=1;j<=M;j++) { scanf(\ sum=0; for(i=1;i<=N;i++) { scanf(\ sum+=a; } printf(\ } return 0; } (3-6)F Description 计算若干整数的和,这些整数都是小于1000的非负整数。 Input 输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。当输入的N为0时表示输入结束。 Output 每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。 Sample Input 3 1 2 3 5 10 15 20 30 50 0 Sample Output 6 125 HINT 用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 #include unsigned int N,i,sum,a; while(scanf(\ { if(N==0) break; else { sum=0; for(i=1;i<=N;i++) { scanf(\ sum+=a; } printf(\ } } return 0; } (3-7)G Description 计算若干整数的和,这些整数都是小于1000的非负整数。 Input 输入的第一行是一个整数M,后面有M个测试用例。每个测试用例以一个整数N开始,后面接着是N个整数。 Output 每组测试用例对应一行输出,为所给的N个整数之和,顺序与输入对应。两样例的输出之间用一个空行分隔开。 Sample Input 2 3 1 2 3 5 10 15 20 30 50 Sample Output 6 125 HINT 用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。 #include