山东科技大学OJ部分题目记答案讲解Word格式.docx

上传人:b****5 文档编号:17455406 上传时间:2022-12-01 格式:DOCX 页数:45 大小:135.84KB
下载 相关 举报
山东科技大学OJ部分题目记答案讲解Word格式.docx_第1页
第1页 / 共45页
山东科技大学OJ部分题目记答案讲解Word格式.docx_第2页
第2页 / 共45页
山东科技大学OJ部分题目记答案讲解Word格式.docx_第3页
第3页 / 共45页
山东科技大学OJ部分题目记答案讲解Word格式.docx_第4页
第4页 / 共45页
山东科技大学OJ部分题目记答案讲解Word格式.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

山东科技大学OJ部分题目记答案讲解Word格式.docx

《山东科技大学OJ部分题目记答案讲解Word格式.docx》由会员分享,可在线阅读,更多相关《山东科技大学OJ部分题目记答案讲解Word格式.docx(45页珍藏版)》请在冰豆网上搜索。

山东科技大学OJ部分题目记答案讲解Word格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1