山科大 C语言程序设计编程精选44例.docx
《山科大 C语言程序设计编程精选44例.docx》由会员分享,可在线阅读,更多相关《山科大 C语言程序设计编程精选44例.docx(111页珍藏版)》请在冰点文库上搜索。
山科大C语言程序设计编程精选44例
问题1:
三个数比较大小
题目描述
从键盘上输入0~100之间的三个数,按从小到大的顺序输出。
输入
输入只有一行,为三个整数。
输出
按从小到大输出这三个数。
样例输入
151020
样例输出
101520
提示
用if语句判断各种情况可以解决这个问题。
解答:
#include
intmain()
{
inta,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(bprintf("%d%d%d",a,b,c);
else
{
if(aprintf("%d%d%d",a,c,b);
else
printf("%d%d%d",c,a,b);
}
}
}
问题2:
输出是m的倍数或n的倍数、但不是m和n的公倍数的数
题目描述
输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n输入
输入三个整数,依次为k、m、n。
输出
从小到大输出符合题意的所有整数,两数之间用一个空格分开。
样例输入
1523
样例输出
23489101415
提示
难点在于输出格式的控制:
空格在数的中间,学会用循环时边界情况的特殊处理。
解答:
#include
intmain()
{
intk,m,n,i,a;
scanf("%d%d%d",&k,&m,&n);
if(m>=n)
a=n;
else
a=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("");
else
printf("%d",i);
}
}
问题3:
A+BProblem
题目描述
计算a+b,0<=a,b<1000。
输入
输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。
输出
每行输出一个a+b的值,顺序与输入对应。
样例输入
12
1020
样例输出
3
30
提示
OJ系统上测试输入结束符为EOF(EndOfFile),其值为-1。
用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。
本题解法参看FAQ。
解答:
#include
intmain()
{
inta,b;
for(;scanf("%d%d",&a,&b)!
=EOF;)
printf("%d\n",a+b);
}
问题4:
A+BProblem(II):
Input/OutputPratice
题目描述
计算a+b,0<=a,b<1000。
输入
输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。
输出
每行输出一个a+b的和,顺序与输入对应。
样例输入
2
12
1020
样例输出
3
30
提示
N给出了测试样例数,用for循环处理方便。
解答:
#include
intmain()
{
intn,a,b,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
}
问题5:
A+BProblem(III):
Input/OutputPratice
题目描述
计算a+b,0<=a,b<1000。
输入
输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。
当测试样为00时表示输入结束,00不参与运算。
输出
每行输出一个a+b的值,顺序与输入对应。
样例输入
12
1020
00
样例输出
3
30
提示
练习break的使用。
解答:
#include
intmain()
{
inta,b;
for(;scanf("%d%d",&a,&b);)
{
if(a==0&&b==0)
break;
printf("%d\n",a+b);
}
}
问题6:
A+BProblem(IV):
Input/OutputPratice
题目描述
计算a+b,0<=a,b<1000。
输入
输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。
输出
每行输出一个a+b的值,顺序与输入对应。
每个格式样例之间用一个空行分隔开。
样例输入
12
1020
1535
样例输出
3
30
50
提示
由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。
解答:
#include
intmain()
{
inti,a,b;
i=1;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
i++;
for(;scanf("%d%d",&a,&b)!
=-1;)
printf("\n%d\n",a+b);
}
问题7:
n个数的最大值和最小值
问题描述
找出n个数中最大的数和最小的数,并将它们的值输出出来。
输入
输入为n+1个整数,都在int类型范围内。
这些数可能用若干空格或者换行符分隔开。
输入的第1个数为n,表示后续有n个数输入。
从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。
输出
输出为两行,格式见sample。
样例输入
301-1
样例输出
Themaximumnumberis1.
Theminimumnumberis-1.
提示
分隔符是空格还是回车都是空白符,对scanf("%d")来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。
解答:
#include
intmain()
{
inta,n,i,min,max;
scanf("%d",&n);
scanf("%d",&a);
min=a;
max=a;
for(i=1;i{
scanf("%d",&a);
if(a>max)
max=a;
if(amin=a;
}
printf("Themaximumnumberis%d.\n",max);
printf("Theminimumnumberis%d.",min);
}
问题8:
成绩的等级
题目描述
把百分制的考试成绩转换成五级制的成绩:
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
intmain()
{
inta;
for(;scanf("%d",&a)!
=-1;)
if(a<0||a>100)
printf("Error\n");
else
{
switch(a/10)
{
case0:
case1:
case2:
case3:
case4:
case5:
printf("Failing\n");break;
case6:
printf("Pass\n");break;
case7:
printf("Average\n");break;
case8:
printf("Good\n");break;
case9:
case10:
printf("Excellent\n");break;
}
}
}
问题9:
只有一个二元运算符的表达式运算
题目描述
编程序读入并计算只有一个二元运算符的表达式的值。
用到的二元运算符有:
“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。
输入
每行输入一个表达式,格式为:
二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。
测试样例不存在除数为0的情况。
输入以a和b为0,且用一个空格分开结束。
输出
每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalidop”。
样例输入
33+5
8*9
2.2
1-6
17/3
9%3
00
样例输出
38
72
invalidop
-5
5
0
提示
教材上有非常相似的例题可以参考。
#include
#include
voidmain()
{
inti,a,b;
charc;
for(i=0;i<=100;i++)
{for(;scanf("%d%c%d",&a,&c,&b)!
=EOF;)
if(a==0&&c==''&&b==0)
gotoloop;
else
switch(c)
{
case'+':
printf("%d\n",a+b);
break;
case'-':
printf("%d\n",a-b);
break;
case'*':
printf("%d\n",a*b);
break;
case'/':
printf("%d\n",a/b);
break;
case'%':
printf("%d\n",a%b);
break;
default:
printf("invalidop\n");
}
}
loop:
i=101;
}
问题10:
求100以内的素数
题目描述
素数是只能被1和自身整除的正整数,根据数学定义1不是素数。
素数也叫质数。
输入
输入为两个整数m和n,满足0<=m<=n<=100。
输出
从大到小输出m~n之间的所有素数,一个素数一行。
如果m~n之间没有素数,则不输出任何数。
输出的所有数在两行“=====”之间。
样例输入
212
样例输出
=====
11
7
5
3
2
=====
提示
利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。
解答:
#include
intmain()
{
inta,b,i,q,j;
scanf("%d%d",&a,&b);
printf("=====\n");
for(j=b;j>=a;j--)
{
q=0;
for(i=2;i{
if(j%i!
=0)
q++;
}
if(q==j-2)
printf("%d\n",j);
}
printf("=====");
}
问题11:
摄氏——华氏温度转换表
题目描述
已知华氏温度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
intmain()
{
doublelow,high;
doublestep,c,f;
charch1,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<=-100)
{
printf("C->F");
while(low<=high+0.01)
{
f=low*9.0/5.0+32;
printf("\n%6.1lf->%6.1lf",low,f);
low+=step;
}
return0;
}
printf("C->F");
while(low<=high+0.01)
{
f=low*9.0/5.0+32;
printf("\n%5.1lf->%5.1lf",low,f);
low+=step;
}
return0;
}
elseif(ch1=='F'&&ch2=='C')
{
scanf("%lf%lf%lf",&low,&high,&step);
c=(low-32)*((double)5/9);
if(low==-100||c<=-100)
{
printf("F->C");
while(low<=high+0.01)
{
c=(low-32)*5/9.0;
printf("\n%6.1lf->%6.1lf",low,c);
low+=step;
}
return0;
}
printf("F->C");
while(low<=high+0.01)
{
c=(low-32)*5/9.0;
printf("\n%5.1lf->%5.1lf",low,c);
low+=step;
}
return0;
}
}
问题12:
1!
+2!
+…+k!
=?
题目描述
求1!
+2!
+…+k!
=?
,并判断是否溢出。
输入
输入为一个正整数k。
输出
若1!
+2!
+…+k!
的值溢出unsigned(无符号整型)的范围输出“overflow”,否则输出1!
+2!
+…+k!
的结果。
样例输入
5
样例输出
153
提示
如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么?
解答:
#include
intmain()
{
inti,j;
unsignedints,b,a;
s=0;
scanf("%d",&j);
b=1;
for(i=1;i<=j;i++)
{a=b;
b=b*i;
if((double)b/a
{printf("overflow\n");
return0;
}
s=s+b;
}
printf("%u\n",s);
return0;
}
问题13:
输出整数的最低两位
题目描述
把一个整数的最低两位打印出来,不输出整数的符号。
输入
输入为一个整数n,不会超出int类型的数据范围。
输出
输出n的最低两位数字。
但是,输入的数字本身不足两位时,不应当补0。
如,输入为“1”,则输出为“1”。
样例输入
-102
样例输出
02
提示
printf函数可以完成补0的操作。
解答:
#include
intmain()
{
inta,b,c;
scanf("%d",&a);
if(a<0)
{
c=-a;
if(c<100)
printf("%d",c);
else
{
b=c-100*(c/100);
printf("%.2d",b);
}
}
else
{
if(a<100)
printf("%d",a);
else
{
b=a-100*(a/100);
printf("%.2d",b);
}
}
}
问题14:
产生等差序列之一
题目描述
根据给出的初始数、公差和序列长度求等差序列。
输入
输入为一行,格式见sample。
其中,start为初始数,step为公差,times为序列长度。
满足,times>0,step不为0。
输出
把这个等差序列输出在一行里,序列两数之间用一个空格分隔。
样例输入
start=1,step=2,times=100
样例输出
13579111315171921232527293133353739414345474951535557596163656769717375777981838587899193959799101103105107109111113115117119121123125127129131133135137139141143145147149151153155157159161163165167169171173175177179181183185187189191193195197199
解答:
#include
intmain()
{
intst,s,t,i;
scanf("start=%d,step=%d,times=%d",&st,&s,&t);
printf("%d",st);
for(i=1;i{
st=st+s;
printf("%d",st);
}
}
问题15:
产生等差序列之二
题目描述
根据给出的初始数、公差和终止条件求等差序列。
输入
输入为一行,格式见sample。
其中,start为初始数,step为公差,end为终止条件。
满足,step不为0,并且start和end的大小关系与step的方向一致。
end不一定是序列的最后一个数。
输出
把这个等差序列输出在一行里,序列两数之间用一个空格分隔。
样例输入
start=1,step=2,end=200
样例输出
13579111315171921232527293133353739414345474951535557596163656769717375777981838587899193959799101103105107109111113115117119121123125127129131133135137139141143145147149151153155157159161163165167169171173175177179181183185187189191193195197199
提示
根据start和step的大小关系,判断序列终止的条件可能不同。
解答:
#include
intmain()
{
intst,s,end;
scanf("start=%d,step=%d,end=%d",&st,&s,&end);
printf("%d",st);
if(s>0)
{
for(st=st+s;st<=end;st=st+s)
printf("%d",st);
}
else
{
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),余数是1