山东科技大学OJ部分题目记问题详解.docx
《山东科技大学OJ部分题目记问题详解.docx》由会员分享,可在线阅读,更多相关《山东科技大学OJ部分题目记问题详解.docx(54页珍藏版)》请在冰豆网上搜索。
山东科技大学OJ部分题目记问题详解
//////////ProblemD:
货币兑换
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
#include
intmain()
{
doublei,j,k,a,b,c,d,e,f;
doublex,y;
scanf("%lf%lf%lf",&i,&j,&k);
scanf("%lf%lf",&x,&y);
a=x/100*i;b=y/100*j;c=x/100*k;
d=y*100/i;e=y*100/j;f=y*100/k;
printf("%.2lf%.2lf%.2lf\n",a,b,c);
printf("%.2lf%.2lf%.2lf\n",d,e,f);
}
////ProblemE:
求字符的值////
Description
从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。
Input
输入为3个字符。
Output
输出为3行。
每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。
每个输出的值占3个字符,不足3个字符前面补0。
SampleInput
0A
SampleOutput
048060030
032040020
065101041
#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);
}
ProblemA:
简单的打折计算
Description
商店规定:
消费满n元,可以打八八折。
设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:
元),精确到分。
Input
输入只有一行,三个整数m、n和x,且0Output
输出金额,精确到分。
SampleInput
953004
SampleOutput
334.40
HINT
了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。
#include
intmain()
{intm,n,x;
floats;
scanf("%d%d%d",&m,&n,&x);
if(m*x>=n)
s=m*x*0.88;
else
s=m*x;
printf("%.2f",s);
}
ProblemC:
水仙花数
Description
如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。
如:
13+53+33=153。
Input
一个整数x,100<=x<=999。
Output
x是水仙花数,则输出“YES”,否则为“NO”。
#include
intmain()
{
intx,a,b,c;
scanf("%d",&x);
a=x%10;
b=x/10%10;
c=x/100;
if(a*a*a+b*b*b+c*c*c==x)
printf("YES");
else
printf("NO");
}
ProblemA:
多少张钞票
Description
客户去商店买东西时,不超过100美金的账单喜欢用现金支付。
商店喜欢用最少的钞票给付客户的找零。
请你编写一个程序帮助商店计算出:
当客户买了x元商品给了一张100美元的钞票后,商店应该付给客户多少张20美元、10美元、5美元和1美元的钞票,使得钞票总数最少。
假设不存在其他面值的钞票,也不会有几角几分的价格,商店的各种钞票总是够用的。
Input
输入一个整数x,0Output
按顺序输出20美金、10美金、5美金和1美金面值的钞票张数。
输出格式见sample。
SampleInput
7
SampleOutput
$20bills:
4
$10bills:
1
$5bills:
0
$1bills:
3
#include
intmain()
{intx,s,a,b,c,d;
scanf("%d",&x);
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;
printf("$20bills:
%d\n",a);
printf("$10bills:
%d\n",b);
printf("$5bills:
%d\n",c);
printf("$1bills:
%d\n",d);
}
ProblemB:
自动拨出电话的程序
SampleInput
(0532)621-15486
SampleOutput
008653262115486
HINT
这是个可以用scanf()解决的问题,请注意电话号码都是数字这个规律。
#include
intmain()
{
inta,b,c;
scanf("(0%d)%d-%d",&a,&b,&c);
printf("0086%d%d%d",a,b,c);
}
///////ProblemC:
求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()
{
unsignedlonglongintn,s,i;
scanf("%llu",&n);
if(n%2==0)
s=n/2*(n+1);
else
s=(n+1)/2*n;
printf("%llu",s);
}
/////////////ProblemD:
2的多少次幂
Description
从键盘输入一个数x,x是2的整数次幂(x=2y),请编程求出y的值。
Input
一个非负有理数x,x在[0,2256]范围内。
Output
一个整数y。
#include
#include
intmain()
{doublex,n;
scanf("%lf",&x);
n=(log10(x))/(log10
(2));
printf("%d",(int)n);
}
////ProblemA:
输出是m的倍数或n的倍数、但不是m和n的公倍数的数
Description
输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,nInput
输入三个整数,依次为k、m、n。
Output
从小到大输出符合题意的所有整数,两数之间用一个空格分开。
SampleInput
1523
SampleOutput
23489101415
#include
intmain()
{
intk,m,n,i=0,j;
scanf("%d%d%d",&k,&m,&n);
for(j=1;j<=k;j++)
{
if((j%m==0&&j%n!
=0)||(j%m!
=0&&j%n==0))
{i++;
if(i==1)
printf("%d",j);
else
printf("%d",j);}
}
}
/////ProblemB:
n个数的最大值和最小值
Description
找出n个数中最大的数和最小的数,并将它们的值输出出来。
Input
输入为n+1个整数,都在int类型范围内。
这些数可能用若干空格或者换行符分隔开。
输入的第1个数为n,表示后续有n个数输入。
从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。
SampleInput
301-1
SampleOutput
Themaximumnumberis1.
Theminimumnumberis-1.
#include
intmain()
{
inti,n,m,max,min;
scanf("%d%d",&n,&max);
min=max;
for(i=1;i{scanf("%d",&m);
if(m>max)
max=m;
if(mmin=m;}
printf("Themaximumnumberis%d.\nTheminimumnumberis%d.",max,min);
}
ProblemC:
成绩的等级
Description
把百分制的考试成绩转换成五级制的成绩:
90~100:
Excellent
80~89:
Good
70~79:
Average
60~69:
Pass
0~59:
Failing
不在0~100之间的输入是非法数据,输出“Error”。
Input
输入多行,每行一个整数。
Output
输入所对应的成绩等级。
#include
#include
#include"string.h"
intmain()
{
intn;
while(scanf("%d",&n)!
=EOF)
{
if(n==100)
printf("Excellent\n");
elseif(n<0||n>100)
printf("Error\n");
else
switch(n/10)
{case9:
printf("Excellent\n");break;
case8:
printf("Good\n");break;
case7:
printf("Average\n");break;
case6:
printf("Pass\n");break;
default:
printf("Failing\n");
}
}
return0;
}
/////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()
{
intN,i,j;
scanf("%d",&N);
inta[N][2];
for(i=0;i{
for(j=0;j<2;j++)
scanf("%d",&a[i][j]);
}
for(i=0;iprintf("%d\n",a[i][0]+a[i][1]);
}
ProblemA:
A+BProblem(III):
Input/OutputPratice
Description
计算a+b,0<=a,b<1000。
Input
输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。
当测试样为00时表示输入结束,00不参与运算。
SampleInput
12
1020
00
SampleOutput
3
30
#include
intmain()
{inta,b;
while
(1)
{
scanf("%d%d",&a,&b);
if(a==0&&b==0)
break;
else
printf("%d\n",a+b);
}
}
ProblemC:
只有一个二元运算符的表达式运算
Description
编程序读入并计算只有一个二元运算符的表达式的值。
用到的二元运算符有:
“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。
Input
每行输入一个表达式,格式为:
二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。
测试样例不存在除数为0的情况。
输入以a和b为0,且用一个空格分开结束。
Output
每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalidop”。
HINT
教材上有非常相似的例题可以参考。
#include
intmain()
{
inta,b;
chari;
while
(1)
{scanf("%d%c%d",&a,&i,&b);
if(a==0&&b==0&&i==32)
break;
else
{switch(i)
{
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");
}
}
}
}
ProblemD:
求100以内的素数
Description
素数是只能被1和自身整除的正整数,根据数学定义1不是素数。
素数也叫质数。
Input
输入为两个整数m和n,满足0<=m<=n<=100。
Output
从大到小输出m~n之间的所有素数,一个素数一行。
如果m~n之间没有素数,则不输出任何数。
输出的所有数在两行“=====”之间。
SampleInput
212
SampleOutput
=====
11
7
5
3
2
=====
HINT
利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。
#include
intmain()
{
intm,n,i,j,k;
scanf("%d%d",&m,&n);
printf("=====\n");
for(i=n;i>=m;i--)
{k=0;
for(j=1;j
if(i%j==0)
k++;
if(k==1)
printf("%d\n",i);
}
printf("=====");
}
ProblemE:
十进制整数转二进制
Description
给出一个十进制的非负整数x,x<=216,把它转换成二进制数输出。
Input
输入为多行,每行一个整数x,至读入EOF结束。
Output
每行输出x对应的二进制数值。
#include
intmain()
{
inti,j,m,n,k;
inta[17];
while(scanf("%d",&n)!
=EOF)
{if(n==0)
printf("0\n");
else
{
for(m=0;m<=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;
break;}
}
for(m=k;m>=0;m--)
printf("%d",a[m]);
printf("\n");
}
}
}
/////ProblemF:
辗转相除法最大公约数的算法
Description
辗转相除法,也称欧几里得算法,是求最大公约数的算法。
Input
输入为多行,每行有一对非负整数a,b,且a*b不会超出int类型的数据范围。
输入至EOF结束。
Output
每行输出一对a,b的最大公约数和最小公倍数,顺序与输入对应。
从数论上的整除定义出发:
若a整除b(b除以a没有余数),则b是a的倍数,a是b的约数,这里要求b不为0。
因此0是任意整数的倍数,但是0不能是约数。
#include
intmain()
{inta,b,c,m,t;
while(scanf("%d%d",&a,&b)!
=EOF)
{if(a==0&&b!
=0)
printf("%d%d\n",b,a);
elseif(a!
=0&&b==0)
printf("%d%d\n",a,b);
else
{if(a
m=a*b;c=a%b;
while(c!
=0){a=b;b=c;c=a%b;}
printf("%d%d\n",b,m/b);}}}
////ProblemA:
简单的整数排序
Description
对给出的若干整数按从小到大排序。
Input
输入的第一个数为n(n<=1000),后接n个整数。
Output
按从小到大的顺序输出这些整数,每两个整数之间用一个空格分隔开,最后一个整数后面没有空格。
SampleInput
103915285673
SampleOutput
1233556789
#include
intmain()
{
inti,j,n,t;inta[1000];
scanf("%d",&n);
for(i=0;iscanf("%d",&a[i]);
for(i=1;ifor(j=0;jif(a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
for(i=0;i{if(i==n-1)
printf("%d",a[i]);
else
printf("%d",a[i]);
}
}
/////ProblemB:
兔子的繁殖问题
Description
假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)?
Input
输入的第一个数为n,接下来有n个数字。
每个数字为一个月份m(m<=45)。
Output
输出为n行,每行为第m个月后的兔子总数。
SampleInput
6
1234510
SampleOutput
1235889
HINT
当n较大时,菲波那契序列的第n项值和计算量都是很大的,可以先计算出菲波那契序列并用数组存储下来,然后查询出每月兔子数,避免重复运算。
#include
intmain()
{
inti,j,k,n;
inta[50]={0,1,2},b[50];
for(i=3;i<=45;i++)
a[i]=a[i-1]+a[i-2];
scanf("%d",&j);
for(k=0;kscanf("%d",&b[k]);
for(k=0;kprintf("%d\n",a[b[k]]);
}
//////ProblemC:
产生等差序列之一
Description
根据给出的初始数、公差和序列长度求等差序列。
Input
输入为一行,格式见sample。
其中,start为初始数,step为公差,times为序列长度。
满足,times>0,step不为0。
Output
把这个等差序列输出在一行里,序列两数之间用一个空格分隔。
SampleInput
start=1,step=2,times=100
SampleOutput
13579111315171921232527293133353739414345474951535557596163656769717375777981838587899193959799101103105107109111113115117119121123125127129131133135137139141143145147149151153155157159161163165167169171173175177179181183185187189191193195197199
HINT
AppendCode
#include
intmain()
{
inti,j,k,n;
chard[100],b[100],c[100];
inta[1000];
scanf("start=%d,step=%d,times=%d",&i,&j,&k);
for(n=0;n{
a[n]=i+j*n;
}
for(n=0;n