山东科技大学OJ部分题目记问题详解.docx
- 文档编号:24808371
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:54
- 大小:88KB
山东科技大学OJ部分题目记问题详解.docx
《山东科技大学OJ部分题目记问题详解.docx》由会员分享,可在线阅读,更多相关《山东科技大学OJ部分题目记问题详解.docx(54页珍藏版)》请在冰豆网上搜索。
山东科技大学OJ部分题目记问题详解
//////////ProblemD:
货币兑换
Description
给出人民币对美元、欧元、日元的当日汇率,求给定金额的人民币能兑换成外币的金额,求给定金额的外币能兑换成人民币的金额。
要计算的外币有三种:
美元、欧元、日元。
Input
输入有三行。
第一行依次为美元、欧元、日元外币汇率,用空格分开。
汇率用100外币为单位,精确到小数点后4位,如668.5200表示“100美元=668.5200人民币”。
汇率浮动范围为(0,10000)。
第二行为外币金额x,第三行为人民币金额y。
x,y均为整数,且0 Output 输出为两行。 第一行为金额为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,且0 Output 输出金额,精确到分。 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,0 Output 按顺序输出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,n Input 输入三个整数,依次为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(m min=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;i printf("%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;i scanf("%d",&a[i]); for(i=1;i for(j=0;j if(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;k scanf("%d",&b[k]); for(k=0;k printf("%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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东 科技大学 OJ 部分 题目 问题 详解