第三次c语言题.doc

上传人:人*** 文档编号:550873590 上传时间:2023-10-27 格式:DOC 页数:21 大小:115.50KB
返回 下载 相关 举报
第三次c语言题.doc_第1页
第1页 / 共21页
第三次c语言题.doc_第2页
第2页 / 共21页
第三次c语言题.doc_第3页
第3页 / 共21页
第三次c语言题.doc_第4页
第4页 / 共21页
第三次c语言题.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《第三次c语言题.doc》由会员分享,可在线阅读,更多相关《第三次c语言题.doc(21页珍藏版)》请在金锄头文库上搜索。

1、问题 A: 十进制整数转二进制时间限制: 1 Sec内存限制: 2 MB提交: 932解决: 399提交状态讨论版题目描述给出一个十进制的非负整数x,x=216,把它转换成二进制数输出。输入输入为多行,每行一个整数x,至读入EOF结束。输出每行输出x对应的二进制数值。样例输入0133365535样例输出01111000011111111111111111提示本题有多种解法:可以用循环迭代对2的除法和取余操作,不过处理的顺序与输出顺序相反,需要利用数组存储;用取对数或从大到小减去2的整数次幂的方法计算与输出顺序是相同的;也可以用printf()把十进制的数值处理成十六进制,然后1位十六进制转4位

2、二进制;也可以用位运算处理。#includeint main()long int a65536,b,c,i,j;while (scanf(%ld,&b)!=EOF)if(b=0)printf(0n);elsec=0;for(i=b;(i/2!=0)|(i=1);i=i/2)ac=i%2;c=c+1;for(j=c-1;j0;j-)printf(%ld,aj);printf(%ldn,a0);问题 B: 求一元二次方程的根时间限制: 1 Sec内存限制: 2 MB提交: 1050解决: 106提交状态讨论版题目描述一元二次方程的标准形式为ax2+bx+c=0(a0),其中a、b、c为常数。求解一

3、元二次方程的根x时有三种情况,分别为(记=b2-4ac):1. 0,有两个不等的实根;2. =0,有两个相同的实根;3. 0。第三行输出为所输入方程的根,分为三种情况:1. 若方程满足0,即有两不等实根x1、x2,则按大小顺序输出这两个实根。2. 若方程满足=0,即有两相同实根x,则输出一个实根。3. 若方程满足0,即有两共轭的虚根x1、x2,则输出两个虚根,虚部符号为正的(即u+vi形式)先输出,虚部符号为负的(x-yi形式)后输出。以上输出均不输出数学上无意义或可省略的的符号,所有数值最多保留6位有效数字。每个样例之后都有一个空行分隔。样例输入1 2 1-1 2 -1-5 2 -0.2-3

4、 2 03 0 122 4 40样例输出Case 1 :x2 + 2x + 1 = 0only one real root : -1Case 2 :x2 - 2x + 1 = 0only one real root : 1Case 3 :5x2 - 2x + 0.2 = 0only one real root : 0.2Case 4 :3x2 - 2x = 0two real roots : 0, 0.666667Case 5 :3x2 + 12 = 0two imaginary roots : 2i, -2iCase 6 :2x2 + 4x + 4 = 0two imaginary root

5、s : -1+i, -1-i提示输出方程格式的各种情况要想清楚,这一部分测试数据给的很全面。另一个就是浮点数的精度控制,这一部分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的结果就能测试出来。

6、浮点数从负数方向运算出结果为0,则浮点值为-0是符合C语言浮点数运算规则的,目前尚不清楚windows XP系统不能产生-0的原因。Append Code#include#include #includeint main()long double a,b,c,o;long int e=1;while(scanf(%llf,&a)!=0)scanf(%llf%llf,&b,&c);printf(Case %ld:n,e);if(a0) if(b=1) printf(+ x );else printf(+ %lgx ,b);else if(b0)printf(+ %lg ,c);else if(c

7、0)printf(two real roots : %lg,%lgn,(-b-sqrt(o)/2/a,(-b+sqrt(o)/2/a);elseif(b!=0)if(fabs(sqrt(-o)/2/a-1)=1e-6) printf(two imaginary roots : %lg+i,%lg-in,-b/2/a,-b/2/a);elseprintf(two imaginary roots : %lg+%lgi,%lg-%lgin,-b/2/a,sqrt(-o)/2/a,-b/2/a,sqrt(-o)/2/a);elseprintf(two imaginary roots : %lgi,-%

8、lgin,sqrt(-o)/2/a,sqrt(-o)/2/a);printf(n);scanf(%llf,&a);e+;问题 C: 辗转相除法时间限制: 1 Sec内存限制: 2 MB提交: 1240解决: 398提交状态讨论版题目描述辗转相除法,也称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的几何原本(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的九章算术。两个整数的最大公约数(亦称公约数)是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252和105的最大公约数是21(252 =

9、 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直到小

10、于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的约数是多少?辗转相除法的计算过程是

11、符合这种定义的。Append Code#includeint main() int a,b,c,k; for(;scanf(%d %d,&b,&a)!=EOF;) if(b=0) printf(%d 0n,a);continue; if(a=0) printf(%d 0n,b);continue; c=a*b; if(ba) a=a+b; b=a-b; a=a-b; k=b%a; for(;k!=0;) b=a; a=k; k=b%a; printf(%d %dn,a,c/a);问题 D: Sum Problem时间限制: 1 Sec内存限制: 2 MB提交: 787解决: 394提交状态讨论版题目描述计算若干整数的和,这些整数都是小于1000的非负整数。输入输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。输出每组测试样例对应一行输出,输出所给的N个整数之和,顺序与输入对应。样例输入3 1 2 35 10 15 20 30 50样例输出6125提示用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。Append Code#includevoid main()int a,b,c,i;while(scanf(%d,&a)!=EOF)c=0; for(i=1;i=a;i+) scanf(%d,&b);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号