山东科技大学OJ部分题目记答案.docx
- 文档编号:12388241
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:104
- 大小:42.61KB
山东科技大学OJ部分题目记答案.docx
《山东科技大学OJ部分题目记答案.docx》由会员分享,可在线阅读,更多相关《山东科技大学OJ部分题目记答案.docx(104页珍藏版)》请在冰豆网上搜索。
山东科技大学OJ部分题目记答案
ProblemA:
Helloworld!
Description
Xiao_ming有两个哥哥,大哥叫Da_min,二哥叫Er_min。
三兄弟放学回家,父母分别跟他们打招呼。
Input
无
Output
请输出:
HelloDa_min,
HelloEr_min,
HelloXiao_ming!
SampleInput
SampleOutput
HelloDa_min,
HelloEr_min,
HelloXiao_ming!
HINT
请注意换行符
#include
intmain()
{
printf("HelloDa_min,\nHelloEr_min,\nHelloXiao_ming!
");
}
ProblemA:
算术基本运算
Description
计算两整数x和y(0 Input 输入只有一行,格式见sample。 Output 输出为多行,按顺序每行输出x,y的和、差、积、商、余数、x的平方和y的三次方,格式见sample SampleInput x=11,y=3 SampleOutput x+y: 14 x-y: 8 x*y: 33 x/yquotient: 3,remainder: 2 x^2: 121 y^3: 27 HINT 注意输入输出格式。 了解C语言整数除法运算符的特点,并且没有求幂的运算符。 #include intmain() { intx,y; scanf("x=%d,y=%d",&x,&y); printf("x+y: %d\n",x+y); printf("x-y: %d\n",x-y); printf("x*y: %d\n",x*y); printf("x/yquotient: %d,remainder: %d\n",x/y,x%y); printf("x^2: %d\n",x*x); printf("y^3: %d\n",y*y*y); } ProblemB: 求圆的面积和周长 Description 从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。 Input 输入一个浮点型数据,有效数字不会超过十进制的6位。 Output 输出为两行。 第一行为圆的面积,第二行为圆的周长,格式见sample。 SampleInput 3 SampleOutput Area: 28.260000 Perimeter: 18.840000 HINT 了解浮点类型的输入、输出和算术运算符 #include #definePI3.14 intmain() { floatr,Area,Perimeter; scanf("%f",&r); Area=PI*r*r; Perimeter=2*PI*r; printf("Area: %f\n",Area); printf("Perimeter: %f\n",Perimeter); } ProblemC: 平均值 Description 求3个数的平均值。 Input 输入只有一行,为3个较小的整数。 Output 输出为这3个整数的平均值,保留3位小数。 SampleInput 123 SampleOutput 2.000 #include intmain() { intx,y,z; floata; scanf("%d%d%d",&x,&y,&z); a=(x+y+z)/3.0; printf("%.3f",a); } 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 224.38165.1918784.75 HINT 了解浮点数据类型的精确度和输出控制。 #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 HINT 了解字符值的存储和整型的关系。 #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); } ProblemF: 奇数还是偶数? Description 输入一个整数,判读它是奇数还是偶数。 Input 输入只有一行,为一个100以的正整数。 Output 输出为一行。 若输入为偶数则输出“even”,奇数输出“odd”。 SampleInput 30 SampleOutput even HINT 用整数运算可以解决,练习“? : ”表达式。 #include intmain() { intx; scanf("%d",&x); x%2==0? printf("even"): printf("odd"); } ProblemG: 绝对值 Description 求整型数据和浮点型数据的绝对值。 Input 输入两个数,第一个是整数,第二个是浮点数。 Output 输出为两行,第一行为整数的绝对值,第二行为浮点数的绝对值,注意浮点数的绝对值不输出无意义的0。 SampleInput -1 1 SampleOutput 1 1 HINT 求绝对值可以用标准库函数来完成,也可以自己判断。 注意浮点数的输出格式。 求绝对值的函数在哪个头文件? 貌似很多人会搞错,包括很多编书的人! #include intmain() { intx; floaty; scanf("%d%f",&x,&y); x>=0? printf("%d\n",x): printf("%d\n",-x); y>=0? printf("%g",y): printf("%g",-y); } 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); } ProblemB: 判断闰年 Description 输入一个正整数的年份,判断是否为闰年。 Input 输入只有一行,为一个10000以的正整数。 Output 输出为一行。 若输入为闰年偶数则输出“Yes”,否则输出“No”。 SampleInput 2010 SampleOutput No HINT 了解逻辑运算符和关系运算符。 #include intmain() { inty; scanf("%d",&y); if(y%4==0&&y%100! =0||y%400==0) printf("Yes"); else printf("No"); } ProblemC: 水仙花数 Description 如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。 如: 13+53+33=153。 Input 一个整数x,100<=x<=999。 Output x是水仙花数,则输出“YES”,否则为“NO”。 SampleInput 153 SampleOutput YES HINT #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 HINT 当能支付大面值钞票时不要支付更小面值的钞票,才能满足钞票总数最少,注意scanf()格式的控制。 #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: 自动拨出的程序 Description 某外国销售公司需要向国的一些大型单位打推销产品。 这个公司的工作场景是这样推销员坐在自己电脑旁边,通过一款自动拨的软件与客户联系。 所有需要被拨打的都事先存储在服务器上,推销员不需要每次都很麻烦的输入客户的,当推销员点击软件里拨打的按钮,下一个将会自动拨出。 现在你需要编写个程序来模拟这个自动拨软件的工作过程。 是按照中国的习惯存储下来的,可能是从上抓取的,也可能是扫描的手写件。 不过它们都被按照这样的格式存储下来: (城市区号)分区前缀-分机号 比如的一个大型单位的某部是(0532)621-15486,是指如果在单位部直接拨打15486就行,在的其他地方要拨打62115486,而在要拨打6。 根据常识,先拨0就是要转外线,所以一般的各个部分都不会以0开头。 你的程序可以把如上格式的翻译成一个只包含有数字的串,发送给机并拨出。 值得注意的是中国的城市区号长度并不相同,比如是010。 再有不同城市的位数也不相同,并且不同单位根据部分机数目多少,有的可能只有3位分机,有的可能分区前缀号会只有2位。 但不管怎样中国现在还没有哪个城市的超过十位数的。 中国的国际区号是0086。 这里不含像114这样的特服。 Input 输入只有一行,是符合“(城市区号)分区前缀-分机号”规律的,这里面除了英文字符“(”、“)”、“-”之外只有数字。 Output 输出只有一行,是带中国区号的能。 注意从国外打国的,城市区号前面的0是不用拨打的。 比如中国的国际分区号是0086532。 SampleInput (0532)621-15486 SampleOutput 5486 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。 SampleInput 1 SampleOutput 0 HINT 看起来数据很大,但是用double完全可以存储。 为什么? 请研究下IEEE-754标准的浮点数存储格式。 这里要用到C语言标准库的数学函数。 #include #include intmain() {doublex,n; scanf("%lf",&x); n=(log10(x))/(log10 (2)); printf("%d",(int)n); } ProblemE: 三个数比较大小 Description 从键盘上输入0~100之间的三个数,按从小到大的顺序输出。 Input 输入只有一行,为三个整数。 Output 按从小到大输出这三个数。 SampleInput 151020 SampleOutput 101520 HINT 用if语句判断各种情况可以解决这个问题。 #include intmain() { intx,y,z,a; scanf("%d%d%d",&x,&y,&z); if(x>y) { a=x; x=y; y=a; } if(x>z) { a=x; x=z; z=a; } if(y>z) { a=y; y=z; z=a; } printf("%d%d%d",x,y,z); } ProblemA: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数 Description 输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n Input 输入三个整数,依次为k、m、n。 Output 从小到大输出符合题意的所有整数,两数之间用一个空格分开。 SampleInput 1523 SampleOutput 23489101415 HINT 难点在于输出格式的控制: 空格在数的中间,学会用循环时边界情况的特殊处理。 #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个数中最大的数和最小的数。 Output 输出为两行,格式见sample。 SampleInput 301-1 SampleOutput Themaximumnumberis1. Theminimumnumberis-1. HINT 分隔符是空格还是回车都是空白符,对scanf("%d")来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。 #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 输入所对应的成绩等级。 SampleInput -1 81 92 35 68 72 100 SampleOutput Error Good Excellent Failing Pass Average Excellent HINT 用switch语句解决这个问题比较方便。 #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; } ProblemD: A+BProblem Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的值,顺序与输入对应。 SampleInput 12 1020 SampleOutput 3 30 HINT OJ系统上测试输入结束符为EOF(EndOfFile),其值为-1。 用scanf()把文件所有容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。 本题解法参看FAQ。 AppendCode #include intmain() {inta,b; while(scanf("%d%d",&a,&b)! =EOF) { printf("%d\n",a+b); } 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的和,顺序与输入对应。 SampleIn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东 科技大学 OJ 部分 题目 答案