第三次c语言题.docx
- 文档编号:12513234
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:24
- 大小:21.09KB
第三次c语言题.docx
《第三次c语言题.docx》由会员分享,可在线阅读,更多相关《第三次c语言题.docx(24页珍藏版)》请在冰豆网上搜索。
第三次c语言题
问题A:
十进制整数转二进制
时间限制:
1Sec内存限制:
2MB
提交:
932解决:
399
[提交][状态][讨论版]
题目描述
给出一个十进制的非负整数x,x<=216,把它转换成二进制数输出。
输入
输入为多行,每行一个整数x,至读入EOF结束。
输出
每行输出x对应的二进制数值。
样例输入
0
1
3
33
65535
样例输出
0
1
11
100001
111
提示
本题有多种解法:
可以用循环迭代对2的除法和取余操作,不过处理的顺序与输出顺序相反,需要利用数组存储;用取对数或从大到小减去2的整数次幂的方法计算与输出顺序是相同的;也可以用printf()把十进制的数值处理成十六进制,然后1位十六进制转4位二进制;也可以用位运算处理。
#include<>
intmain()
{
longinta[65536],b,c,i,j;
while(scanf("%ld",&b)!
=EOF)
{
if(b==0)
printf("0\n");
else
{
c=0;
for(i=b;(i/2!
=0)||(i==1);i=i/2)
{
a[c]=i%2;
c=c+1;
}
for(j=c-1;j>0;j--)
printf("%ld",a[j]);
printf("%ld\n",a[0]);
}
}
}
问题B:
求一元二次方程的根
时间限制:
1Sec内存限制:
2MB
提交:
1050解决:
106
[提交][状态][讨论版]
题目描述
一元二次方程的标准形式为ax2+bx+c=0(a≠0),其中a、b、c为常数。
求解一元二次方程的根x时有三种情况,分别为(记Δ=b2-4ac):
1.Δ>0,有两个不等的实根;
2.Δ=0,有两个相同的实根;
3.Δ<0,有两个共轭的虚根。
输入
输入为多行,每行为一元二次方程的三个常数a,b,c,在double类型范围之内。
当输入的a为0时,表示输入结束。
输出
每行输入的样例对应三行输出。
第一行输出为样例的编号。
第二行输出为所输入常数a,b,c对应的一元二次方程的标准形式,要求输出满足a>0。
第三行输出为所输入方程的根,分为三种情况:
1.若方程满足Δ>0,即有两不等实根x1、x2,则按大小顺序输出这两个实根。
2.若方程满足Δ=0,即有两相同实根x,则输出一个实根。
3.若方程满足Δ<0,即有两共轭的虚根x1、x2,则输出两个虚根,虚部符号为正的(即u+vi形式)先输出,虚部符号为负的(x-yi形式)后输出。
以上输出均不输出数学上无意义或可省略的的符号,所有数值最多保留6位有效数字。
每个样例之后都有一个空行分隔。
样例输入
121
-12-1
-52
-320
3012
244
0
样例输出
Case1:
x^2+2x+1=0
onlyonerealroot:
-1
Case2:
x^2-2x+1=0
onlyonerealroot:
1
Case3:
5x^2-2x+=0
onlyonerealroot:
Case4:
3x^2-2x=0
tworealroots:
0,
Case5:
3x^2+12=0
twoimaginaryroots:
2i,-2i
Case6:
2x^2+4x+4=0
twoimaginaryroots:
-1+i,-1-i
提示
输出方程格式的各种情况要想清楚,这一部分测试数据给的很全面。
另一个就是浮点数的精度控制,这一部分sample给出了例子。
值得注意的是,linux下gcc编译的浮点数运算结果有-0,这是OJ系统Judge端使用的系统;而windowsXP下的minGW编译器和VC6不会产生-0,只会输出0;但windows7下的minGW编译器是能够产生-0的(确实很诡异)。
因此使用windowsXP的同学忽略了对结果为0的检测,程序需要对结果为0的情况进行全面考虑,确保正确的输出0。
这个问题卡了好些同学好几天。
关于是否会产生-0,输出表达式-1的结果就能测试出来。
浮点数从负数方向运算出结果为0,则浮点值为-0是符合C语言浮点数运算规则的,目前尚不清楚windowsXP系统不能产生-0的原因。
AppendCode
#include<>
#include<>
#include<>
intmain()
{
longdoublea,b,c,o;
longinte=1;
while(scanf("%llf",&a)!
=0)
{
scanf("%llf%llf",&b,&c);
printf("Case%ld:
\n",e);
if(a<0){a=-a;b=-b;c=-c;}
if(a==1)printf("x^2");
elseprintf("%llfx^2",a);
if(b>0)
{if(b==1)printf("+x");
elseprintf("+%lgx",b);}
elseif(b<0)
{if(b==-1)printf("-x");
elseprintf("-%lgx",-b);}
if(c>0)printf("+%lg",c);
elseif(c<0)
printf("-%lg",-c);
printf("=0\n");
o=b*b-4*a*c;
if(o==0)
{printf("onlyonerealroot:
%lg\n",-b/2/a);}
elseif(o>0)
{printf("tworealroots:
%lg,%lg\n",(-b-sqrt(o))/2/a,(-b+sqrt(o))/2/a);}
else
{if(b!
=0)
{if(fabs(sqrt(-o)/2/a-1)<=1e-6)
printf("twoimaginaryroots:
%lg+i,%lg-i\n",-b/2/a,-b/2/a);
else
printf("twoimaginaryroots:
%lg+%lgi,%lg-%lgi\n",-b/2/a,sqrt(-o)/2/a,-b/2/a,sqrt(-o)/2/a);
}
else
printf("twoimaginaryroots:
%lgi,-%lgi\n",sqrt(-o)/2/a,sqrt(-o)/2/a);
}
printf("\n");
scanf("%llf",&a);
e++;
}
}
问题C:
辗转相除法
时间限制:
1Sec内存限制:
2MB
提交:
1240解决:
398
[提交][状态][讨论版]
题目描述
辗转相除法,也称欧几里得算法,是求最大公约数的算法。
辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。
两个整数的最大公约数(亦称公约数)是能够同时整除它们的最大的正整数。
辗转相除法基于如下原理:
两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。
例如,252和105的最大公约数是21(252=21×12;105=21×5);因为252105=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的最大公约数和最小公倍数,顺序与输入对应。
样例输入
11
23
22
32
46
75
126
189
2436
样例输出
11
16
22
16
212
135
612
918
1272
提示
按照题目描述所给的算法解题,注意以下几点:
辗转相除法对两个数的大小关系有要求,根据倍数和约数的数学定义,一个非0数和0的约数是多少辗转相除法的计算过程是符合这种定义的。
AppendCode
#include<>
intmain()
{
inta,b,c,k;
for(;scanf("%d%d",&b,&a)!
=EOF;)
{
if(b==0)
{
printf("%d0\n",a);continue;
}
if(a==0)
{
printf("%d0\n",b);continue;
}
c=a*b;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三次 语言