山东科技大学OJ部分题目记答案讲解Word格式.docx
《山东科技大学OJ部分题目记答案讲解Word格式.docx》由会员分享,可在线阅读,更多相关《山东科技大学OJ部分题目记答案讲解Word格式.docx(45页珍藏版)》请在冰豆网上搜索。
stdio.h>
charx,y,z;
scanf(>
%c%c%c>
&
y,&
z);
%・3d%.3o%.3x\n*,x,x,x);
prlntfC%.3d%.3o%.3x\n*,y,y,y);
%•3d%.3o%.3x\n"
z>
z,z);
}
ProblemA:
简单的打折计算
商店规定:
消费满n元,可以打八八折。
设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:
元),精确到分。
输入只有一行,三个整数m、n和x,且0<
x<
m<
n<
1000o
输出金额,精确到分。
334.40
HINT
了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。
#include<
{int%n,x;
floats;
scanf("
%d%dAm,&
n,;
if(m*x>
=n)
s=m*x*0.88;
else
s=m*x;
printf(”%•2fs);
ProblemC:
水仙花数
如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。
如:
13+53+33=153o
一个整数x,100<
=x<
=999。
x是水仙花数,则输出《YESS否则为“NOS
^include<
intx,a»
b,c:
%d笃&
x);
a=x%10;
b=x/10%10;
c=x/100;
if(a*a*a+b*b*b+c*c*c=x)
YES"
);
NO"
多少张钞票
客户去商店买东西时,不超过100美金的账单喜欢用现金支付。
商店喜欢用最少的钞票给付客户的找零。
请你编写一个程序帮助商店计算出:
当客户买了x元商品给了一张100美元的钞票后,商店应该付给客户多少张20美元、10美元、5美元和1美元的钞票,使得钞票总数最少。
假设不存在其他面值的钞票,也不会有几角几分的价格,商店的各种钞票总是够用的。
输入一个整数x,0<
100c
按顺序输出20美金、10美金、5美金和1美金面值的钞票张数。
输出格式见sampleo
$20bills:
4
S10bills:
1
$5bills:
0
$1bills:
3
intmainO{ints>
a>
b,c,d;
scanf&
s=100-x;
a=s/20;
b=(s-20*a)/10;
c=(s"
20*a"
10*b)/5;
d=s-20*a-10*b"
c*5;
(320(3io(”$5C$1
ProblemB:
自动拨出电话的程序
(0532)621-15486
008653262115486
这是个可以用scaiifO解决的问题,请注意电话号码都是数字这个规律。
inta,b,
(0%d)&
a,&
b,&
c);
0086%d%d%d"
a,b,c);
///////ProblemC:
求1+2+.••+n=?
给定一个n,求出s=l+2+3+...+n的值。
输入只有一行,包含一个正整数n(n<
=232)o
输出一行,为l+2+...+n的值。
55
n的数据范闱人,需注意数据类型的选择和计算次序,以避免数据溢出。
unsignedlonglongintn,s,i;
scanf&
n);
if(n%2=0)
s=n/2*(n+1);
s=(n+l)/2*n;
printfC%llu*,s);
/////////////ProblemD:
2的多少次幕
从键盘输入一个数x,x是2的整数次幕(x=2E,请编程求出y的值。
一个非负有理数x,x在[0,2-56]范围内。
一个整数y°
math・h>
(double冷n;
幻f"
n=(loglO(x))/(loglO
(2));
printf(int)n);
////ProblemA:
输出是m的倍数或n的倍数、但不是m和n的公倍数的数
输出1〜k之间是m的倍数或ii的倍数、但不是m和n的公倍数的数,其中l<
=m,n<
k<
100,且m与n不相等。
输入三个整数,依次为k、m、no
从小到人输出符合题意的所有整数,两数之间用一个空格分开。
irrtmainO
intk>
m,n,i=0,j;
%d%d&
k,&
for(j=l;
j<
=k;
j++)
if((j%m=0&
&
j%n!
=0)||(j%m!
=O&
j%n==O))
if(i=l)
printf(“%<
T\j);
printf(“%d*,j);
/////ProblemB:
n个数的最大值和最小值
找出n个数中最大的数和最小的数,并将它们的值输出出来。
输入为n+1个整数,都在int类型范I制内。
这些数可能用若干空格或者换行符分隔开。
输入的第1个数为m表示后续有11个数输入。
从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。
Themaximumnumberis1・
Theminimumnumberis-1・
inti,n,max,min;
scanfAn,&
max);
min=max;
for(i=l;
i<
n;
i++)
{scanf&
m);
if(m>
max)
max=m;
if(m<
min)
printf("
Themaximumnumberis%d・\nTheminimumnumberis%d.max,min);
成绩的等级
把百分制的考试成绩转换成五级制的成绩:
90〜100:
Excellent
80〜89:
Good
70〜79:
Average
60〜69:
Pass
0〜59:
Failing
不在0-100之间的输入是非法数据,输出“Error”。
输入多行,每行一个整数。
输入所对应的成绩等级。
stdio・h>
#include〈stdlib・h>
#include"
string・h"
intn;
while(scanf&
n)!
=EOF)
if(n==100)
Excellent\n"
elseif(n<
0In>
100)
Error\nz,);
switch(n/10)
{case9:
Excellent\n〃);
b:
rEak;
case8:
Good'
n"
break;
case7:
printf(“AveragE'
case6:
Pass'
break:
defauIt:
Failing'
return0;
/////ProblemE:
A+BProblem(II):
Input/0utputPratice
计算a+b,0<
=a,b<
输入的第一行是一个整数N,后面有N对整数a和b,每对n和b占一行,a,b用空格分开。
每行输出一个a+b的和,顺序与输入对应。
2
12
1020
3
30
N给出了测试样例数,用for循环处理方便。
intN,i,j;
scanf(,z%d,z,&
N);
inta[N][2];
for(i=0;
N;
for(j=0;
2;
a[i][j]);
%d\n"
a[i][0]+a[i][1]);
A+BProblem(III):
输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。
当测试样为00时表示输入结束,00不参与运算。
00
I
{inta,b;
while
(1)
scanf(z,%d&
b);
if(a=0&
b==0)
printfa+b);
只有一个二元运算符的表达式运算
编程序读入并计算只有一个二元运算符的表达式的值。
用到的二元运算符有:
“+J9=《*、“严、与C语言的语法一致。
每行输入一个表达式,格式为:
二个整型的操作数3和b,中间用一个符号分开,这个符号就是运算符。
测试样例不存在除数为0的情况。
输入以a和b为0,且用一个空格分开结束。
每行对应输入的运算符为“+J“』、“杯、“厂、则计算a+b、a-b.a*b.a/b、a%b的值;
否则输出“invalidop”。
SampleInputs
33+5.
8木9:
2.2
1~6
17/3:
9%3「
教材上有非常相似的例题可以参考。
#include〈stdio・h>
inta,b;
chari;
{scanf(,z%d%c%dz,,&
i,&
if(a=0&
b=0&
i=32)
(switch(i)
case'
+'
:
printf(“%d\n"
a+b);
-’:
printfa~b);
*'
a*b);
「:
a/b);
case‘%’:
printf(“%d\n"
a%b);
default:
printf(^invalidop\n"
ProblemD:
求100以内的素数
素数是只能被1和自身整除的正整数,根据数学定义1不是素数。
素数也叫质数。
输入为两个整数m和m满足0<
=m<
=ii<
=100。
从人到小输出m〜Il之间的所有素数,一个素数一行。
如果m〜11之间没有素数,则不输出任何数。
输出的所有数在两行“一”之间。
212
11
7
5
利用素数的数学规律可以很容易的解出此题,题目给出的数据范I韦I是关键。
#include<
intm,n,i,j,k;
scanf(,z%d%d,z,&
m,&
printf(〃二二=二\11〃);
for(i=n;
i>
=m;
i--)
{k=0;
for(j=l;
j<
i;
j++)
if(i%j=O)
k++;
if(k=l)
printfi);
printf(〃二==〃);
ProblemE:
十进制整数转二进制
给出一个十进制的非负整数x,x<
=2“,把它转换成二进制数输出。
输入为多行,每行一个整数X,至读入EOF结束。
每行输出X对应的二进制数值。
O
1
33.
65535<
f■■
inti,j,m,n,k;
inta[17];
whi.1e(scanf(^d^,&
n)!
=EOF)
{辻(n~0)
0\n"
for(m=0;
=16;
m++)i=n%2;
j=n/2;
n二j;
a[m]=i;
for(m=16;
m>
二0;
m--)
if(a[m]==1)
{k二m;
for(m=k;
m>
=0:
m--)printf(“%d"
a[m]);
printf(〃\n"
/////ProblemF:
辗转相除法最大公约数的算法
辗转相除法,也称欧几里得算法,是求最人公约数的算法。
Input
输入为多行,每行有一对非负整数a,b,且a"
不会超出mt类型的数据范|韦1。
输入至EOF结束。
每行输出一对比b的最大公约数和最小公倍数,顺序与输入对应。
从数论上的整除定义出发:
若a整除b(b除以a没有余数),则b是a的倍数,a是b的
约数,这里要求b不为0。
因此0是任意整数的倍数,但是0不能是约数。
SampleOutputs
1272.
intmainO
{inta,b,c,m,t;
while(scanfC%d%d"
b)!
=EOF){if(a=0&
b!
=0)
printf(〃対db,a);
elseif(a!
=0&
b=0)
printf(,z%d%d\n\a,b);
{if(a<
b){t二a;
a=b;
b=t;
}m=a*b:
c=a%b;
while(c!
=0){a=b;
b=c;
}printf(,z%d%d\n"
b,m/b);
}}}
简单的整数排序
对给出的若干整数按从小到人排序。
输入的第一个数为n(n<
=1000>
后接n个整数。
按从小到人的顺序输出这些整数,每两个整数之间用一个空格分隔开,最后一个整数后面没有空格。
103915285673
1233556789
inti,j,n,t;
inta[1000];
for(i=0;
a[i]);
for(i=l;
for(j=0;
n-l;
if(a[j]>
a[j+ll)
a[j]=a[j+l];
a[j+l]=t;
}
{if(i==n-l)
printf(“%d"
a[i]);
printf(“%d,z,a[i]);
兔子的繁殖问题
假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)?
输入的第一个数为n,接下来有n个数字。
每个数字为一个月份m(m<
=45)。
输出为n行,每行为第m个月后的兔子总数。
当n较人时,菲波那契序列的第n项值和计算量都是很人的,可以先计算出菲波那契序列并用数组存储下来,然后查询出每月兔子数,避免重复运算。
inti,j,k,n;
inta[50]={0,l,2},b[50];
for(i=3;
=45;
i++)a[i]=a[i-l]+a[i-2];
scanf&
j);
for(k二O;
k〈j;
k++)
b[k]);
k++)printf(“%d\n"
a[b[k]]);
//////ProblemC:
产生等差序列之一
根据给出的初始数、公差和序列长度求等差序列。
输入为一行,格式见sampleo其中,start为初始数,step为公差,tunes为序列长度。
满
足,tiines>
0,step不为0。
把这个等差序列输出在一行里,序列两数之间用一个空格分隔。
start二1,step=2,times=100
135791113151719212325272931333537394143454749
5153555759616365676971737577798183858789919395
9799101103105107109111113115117119121123125127129131
133135137139141143145147149151153155157159161163165
167169171173175177179181183185187189191193195197199
AppendCode
chard[100],b[100],c[100];
inta[1000];
start=%d,step=%d,times=,&
i,&
j,&
k);
for(n=0;
k;
n++)
a[n]=i+j*n;
if(n==k~l)
printfa[n]);
printf(,z%d"
a[n]);
////ProblemD:
产生等差序列之二
根据给出的初始数、公差和终止条件求等差序列。
输入为一行,格式见sampleo其中,start为初始数,step为公差,end为终止条件。
满足,step不为0,并且start和end的大小关系与step的方向一致。
end不一定是序列的最后一个数。
start=1,step