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