C语言作业.docx
《C语言作业.docx》由会员分享,可在线阅读,更多相关《C语言作业.docx(66页珍藏版)》请在冰豆网上搜索。
C语言作业
ProblemB:
算术基本运算
Description
计算两整数x和y(0Input
输入只有一行,格式见sample。
Output
输出为多行,按顺序每行输出x,y的和、差、积、商、余数、x的平方和y的三次方,格式见sample
SampleInput
x=11,y=3
SampleOutput
x+y:
14
x-y:
8
x*y:
33
x/yquotient:
3,remainder:
2
x^2:
121
y^3:
27
HINT
注意输入输出格式。
了解C语言整数除法运算符的特点,并且没有求幂的运算符。
#include
intmain()
{
intx,y;
scanf("x=%d,y=%d",&x,&y);
printf("x+y:
%d\n",x+y);
printf("x-y:
%d\n",x-y);
printf("x*y:
%d\n",x*y);
printf("x/yquotient:
%d,remainder:
%d\n",x/y,x%y);
printf("x^2:
%d\n",x*x);
printf("y^3:
%d\n",y*y*y);
return0;
}
ProblemC:
求圆的面积和周长
Description
从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。
Input
输入一个浮点型数据,有效数字不会超过十进制的6位。
Output
输出为两行。
第一行为圆的面积,第二行为圆的周长,格式见sample。
SampleInput
3
SampleOutput
Area:
28.260000
Perimeter:
18.840000
HINT
了解浮点类型的输入、输出和算术运算符
#include
intmain()
{
doubleArea,Perimeter,r,p=3.14;
scanf("%lf",&r);
Area=p*r*r,Perimeter=2*p*r;
printf("Area:
%lf\n",Area);
printf("Perimeter:
%lf\n",Perimeter);
return0;
}
ProblemD:
平均值
Description
求3个数的平均值。
Input
输入只有一行,为3个较小的整数。
Output
输出为这3个整数的平均值,保留3位小数。
SampleInput
123
SampleOutput
2.000
HINT
注意除法运算对整型数据和浮点型数据是不一样的。
#include
intmain()
{
intx,y,z;
floatave;
scanf("%d%d%d",&x,&y,&z);
ave=(x+y+z)/3.0;
printf("%.3f",ave);
return0;
}
ProblemE:
货币兑换
Description
给出人民币对美元、欧元、日元的当日汇率,求给定金额的人民币能兑换成外币的金额,求给定金额的外币能兑换成人民币的金额。
要计算的外币有三种:
美元、欧元、日元。
Input
输入有三行。
第一行依次为美元、欧元、日元外币汇率,用空格分开。
汇率用100外币为单位,精确到小数点后4位,如668.5200表示“100美元=668.5200人民币”。
汇率浮动范围为(0,10000)。
第二行为外币金额x,第三行为人民币金额y。
x,y均为整数,且0Output
输出为两行。
第一行为金额为x的美元、欧元、日元兑换成人民币的金额,用空格分开。
第二行为金额为y的人民币兑换成美元、欧元、日元的金额,用空格分开。
所有金额精确到小数点后两位。
SampleInput
668.5200908.06857.9852
1500
1500
SampleOutput
10027.8013621.03119.78
224.38165.1918784.75
HINT
了解浮点数据类型的精确度和输出控制。
#include
intmain()
{
doublea,b,c;
doublex;
doubley;
scanf("%lf%lf%lf",&a,&b,&c);
scanf("%lf",&x);
scanf("%lf",&y);
printf("%.2lf%.2lf%.2lf\n",x*0.01*a,x*0.01*b,x*0.01*c);
printf("%.2lf%.2lf%.2lf\n",y/a*100,y/b*100,y/c*100);
return0;
}
ProblemF:
求字符的值
Description
从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。
Input
输入为3个字符。
Output
输出为3行。
每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。
每个输出的值占3个字符,不足3个字符前面补0。
SampleInput
0A
SampleOutput
048060030
032040020
065101041
HINT
了解字符值的存储和整型的关系。
#include
intmain()
{
charx,y,z;
scanf("%c%c%c",&x,&y,&z);
printf("%.3d%.3o%.3x\n",x,x,x);
printf("%.3d%.3o%.3x\n",y,y,y);
printf("%.3d%.3o%.3x\n",z,z,z);
return0;
}
ProblemG:
奇数还是偶数?
Description
输入一个整数,判读它是奇数还是偶数。
Input
输入只有一行,为一个100以内的正整数。
Output
输出为一行。
若输入为偶数则输出“even”,奇数输出“odd”。
SampleInput
30
SampleOutput
even
HINT
用整数运算可以解决,练习“?
:
”表达式。
#include
intmain()
{
intx;
scanf("%d",&x);
if(x%2==0)
printf("even");
else
printf("odd");
return0;
}
ProblemH:
绝对值
Description
求整型数据和浮点型数据的绝对值。
Input
输入两个数,第一个是整数,第二个是浮点数。
Output
输出为两行,第一行为整数的绝对值,第二行为浮点数的绝对值,注意浮点数的绝对值不输出无意义的0。
SampleInput
-1
1
SampleOutput
1
1
HINT
求绝对值可以用标准库函数来完成,也可以自己判断。
注意浮点数的输出格式。
求绝对值的函数在哪个头文件?
貌似很多人会搞错,包括很多编书的人!
#include
#include
intmain()
{
intx;
floaty;
scanf("%d",&x);
scanf("%f",&y);
printf("%d\n",abs(x));
printf("%g\n",fabs(y));
return0;
}
ProblemI:
简单的打折计算
Description
商店规定:
消费满n元,可以打八八折。
设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:
元),精确到分。
Input
输入只有一行,三个整数m、n和x,且0Output
输出金额,精确到分。
SampleInput
953004
SampleOutput
334.40
HINT
了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。
#include
intmain()
{
intm,n,x;
doubley;
scanf("%d%d%d",&m,&n,&x);
y=m*x;
if(y>n)
y=y*0.88;
else
y=y;
printf("%.2lf\n",y);
return0;
}
Description
输入一个正整数的年份,判断是否为闰年。
Input
输入只有一行,为一个10000以内的正整数。
Output
输出为一行。
若输入为闰年偶数则输出“Yes”,否则输出“No”。
SampleInput
2010
SampleOutput
No
HINT
了解逻辑运算符和关系运算符。
#include
intmain()
{
inta;
scanf("%d",&a);
if(a%4==0&&a%100!
=0||a%400==0)
printf("Yes");
elseprintf("No");
return0;
}
ProblemK:
GHacker的解谜过关游戏
Description
GHacker最近痴迷于一个新上市的解谜游戏,其中一关的过关是破解一个字符串S。
经过3天的冥思苦想,GHacker成功的搞明白了这其中的奥秘,把串S中的整数取出来求和,就可以过关了。
但是GHacker的数学实在糟糕。
他无法在短暂的时间内算出来,只好求助Jackie。
Jackie观察到虽然每次出现的数字不同,但是其它的符号并不会变化。
于是Jackie编写了一个非常短的程序,帮助GHacker把这一关过了。
Input
输入为串S,只有一行。
Output
串S中用非数字(0~9)分隔开的非负整数之和,不会超出int类型的数据范围。
SampleInput
`13?
:
[7514],54.487=="(438922x159?
?
392)%032\n111cdef120$95;
SampleOutput
447899
HINT
scanf()可以解决这个问题,注意转义字符和格式控制字符。
#include
intmain()
{
inti,sum,num;
charstr[1000];
while(scanf("%s",str)!
=EOF)
{
num=sum=0;
for(i=0;;i++)
{
if(str[i]>='0'&&str[i]<='9')
num=num*10+str[i]-'0';
else
{
sum=sum+num;num=0;
if(str[i]=='\0')break;
}
}
printf("%d\n",sum);
}
return0;
}
ProblemL:
水仙花数
Description
如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。
如:
13+53+33=153。
Input
一个整数x,100<=x<=999。
Output
x是水仙花数,则输出“YES”,否则为“NO”。
SampleInput
153
SampleOutput
YES
#include
intmain()
{
intx,a,b,c,sum;
scanf("%d",&x);
a=x/100;
b=(x-a*100)/10;
c=(x-a*100-b*10);
sum=a*a*a+b*b*b+c*c*c;
if(x==sum)
printf("YES");
else
printf("NO");
return0;
}
ProblemM:
求1+2+...+n=?
Description
给定一个n,求出s=1+2+3+...+n的值。
Input
输入只有一行,包含一个正整数n(n<=232)。
Output
输出一行,为1+2+...+n的值。
SampleInput
10
SampleOutput
55
HINT
n的数据范围大,需注意数据类型的选择和计算次序,以避免数据溢出。
#include
intmain()
{
unsignedlonglongn,s,a;
scanf("%llu",&n);
a=n%2;
if(a==0)
{
s=n/2*(n+1);
printf("%llu",s);
}
elseif(a!
=0)
{s=n*((n+1)/2);
printf("%llu",s);
}
return0;
}
ProblemN:
2的多少次幂
Description
从键盘输入一个数x,x是2的整数次幂(x=2y),请编程求出y的值。
Input
一个非负有理数x,x在[0,2256]范围内。
Output
一个整数y。
SampleInput
1
SampleOutput
0
HINT
看起来数据很大,但是用double完全可以存储。
为什么?
请研究下IEEE-754标准的浮点数存储格式。
这里要用到C语言标准库的数学函数。
#include
intmain()
{
doublex;
scanf("%lf",&x);
printf("%g",log2(x));
return0;
}
ProblemA:
哪一行比较长
Description
读取两行字符串,按每行的长度从长到短输出。
Input
输入为两行,每行不会超过26个字符。
Output
输出为两行,按每行的长度从长到短输出。
SampleInput
abcdefghijk
abcdefghijklmnopqrstuvwxyz
SampleOutput
abcdefghijklmnopqrstuvwxyz
abcdefghijk
HINT
了解字符串的存储和操作,了解gets()和scanf("%s")读入字符串的不同之处。
#include
#include
intmain()
{
intx,y;
chara[30],b[30];
gets(a);
gets(b);
x=strlen(a);
y=strlen(b);
if(x>y)
{
puts(a);
puts(b);
return0;
}
puts(b);
puts(a);
}
ProblemB:
三个数比较大小
Description
从键盘上输入0~100之间的三个数,按从小到大的顺序输出。
Input
输入只有一行,为三个整数。
Output
按从小到大输出这三个数。
SampleInput
151020
SampleOutput
101520
HINT
用if语句判断各种情况可以解决这个问题。
include
intmain()
{
inta,b,c,t;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{
t=a;
a=b;
b=t;
}
if(a>c)
{
t=a;
a=c;
c=t;
}
if(b>c)
{
t=b;
b=c;
c=t;
}
printf("%d%d%d\n",a,b,c);
return0;
}
ProblemC:
输出是m的倍数或n的倍数、但不是m和n的公倍数的数
Description
输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,nInput
输入三个整数,依次为k、m、n。
Output
从小到大输出符合题意的所有整数,两数之间用一个空格分开。
SampleInput
1523
SampleOutput
23489101415
HINT
难点在于输出格式的控制:
空格在数的中间,学会用循环时边界情况的特殊处理。
#include
intmain()
{
intk,m,n,a;
scanf("%d%d%d",&k,&m,&n);
{
if(m>n)
{
printf("%d",n);
for(a=n+1;a<=k;a++)
{
if((a%m==0&&a%n!
=0)||(a%m!
=0&&a%n==0))
printf("%d",a);}
}
else
{
printf("%d",m);
for(a=m+1;a<=k;a++)
{
if((a%m==0&&a%n!
=0)||(a%m!
=0&&a%n==0))
printf("%d",a);}
}
}
return0;
}
ProblemD:
A+BProblem
Description
计算a+b,0<=a,b<1000。
Input
输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。
Output
每行输出一个a+b的值,顺序与输入对应。
SampleInput
12
1020
SampleOutput
3
30
HINT
OJ系统上测试输入结束符为EOF(EndOfFile),其值为-1。
用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。
本题解法参看FAQ。
#include
intmain()
{
inta,b;
while(scanf("%d%d\n",&a,&b)!
=EOF)
printf("%d\n",a+b);
}
ProblemE:
A+BProblem(II):
Input/OutputPratice
Description
计算a+b,0<=a,b<1000。
Input
输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。
Output
每行输出一个a+b的和,顺序与输入对应。
SampleInput
2
12
1020
SampleOutput
3
30
HINT
N给出了测试样例数,用for循环处理方便。
#include
intmain()
{
inta,b,N,i;
scanf("%d\n",&N);
for(i=1;i<=N;i++)
{
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
return0;
}
ProblemF:
A+BProblem(III):
Input/OutputPratice
Description
计算a+b,0<=a,b<1000。
Input
输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。
当测试样为00时表示输入结束,00不参与运算。
Output
每行输出一个a+b的值,顺序与输入对应。
SampleInput
12
1020
00
SampleOutput
3
30
HINT
练习break的使用。
#include
intmain()
{
inta,b;
while(scanf("%d%d",&a,&b))
{
if(a==0&&b==0)
break;
printf("%d\n",a+b);
}
}
ProblemG:
A+BProblem(IV):
Input/OutputPratice
Description
计算a+b,0<=a,b<1000。
Input
输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。
Output
每行输出一个a+b的值,顺序与输入对应。
每个格式样例之间用一个空行分隔开。
SampleInput
12
1020
1535
SampleOutput
3
30
50
HINT
由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。
#include
intmain()
{
inta,b,i;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
while(scanf("%d%d",&a,&b)!
=EOF)
printf("\n%d\n",a+b);
}
ProblemH:
n个数的最大值和最小值
Description
找出n个数中最大的数和最小的数,并将它们的值输出出来。
Input
输入为n+1个整数,都在int类型范围内。
这些数可能用若干空格或者换行符分隔开。
输入的第1个数为n,表示后续有n个数输入。
从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。
Output
输出为两行,格式见sample。
SampleInput
301-1
SampleOutput
Themaximumnumberis1.
Theminimumnumberis-1.
HINT
分隔符是空格还是回车都是空白符,对scanf("%d")来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。
#include
intmain()
{
intn,i,max,min,x,y;
scanf("%d",&n);
scanf("%d",&x);
min=x;
max=x;
for(i=3;i<=n+1;i++)
{
scanf("%d",&y);
if(min>y)
min=y;
if(maxmax=y;
}
printf("Themaximumnumberis%d.\n",max);
printf("Theminimumnumberis%d.\n",min);
return0;
}
ProblemI:
成绩的等级
Description
把百分制的考试成绩转换成五级制的成绩:
90~100:
Excellent
80~89:
Good
70~79: