山科oj题目.doc

上传人:laozhun 文档编号:3273210 上传时间:2023-03-12 格式:DOC 页数:61 大小:237KB
返回 下载 相关 举报
山科oj题目.doc_第1页
第1页 / 共61页
山科oj题目.doc_第2页
第2页 / 共61页
山科oj题目.doc_第3页
第3页 / 共61页
山科oj题目.doc_第4页
第4页 / 共61页
山科oj题目.doc_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《山科oj题目.doc》由会员分享,可在线阅读,更多相关《山科oj题目.doc(61页珍藏版)》请在三一办公上搜索。

1、Oj题目汇集本学期至今oj所有题目汇编实验1Problem A: 简单的打折计算Time Limit: 1 SecMemory Limit: 2 MBSubmit: 2444Solved: 1201SubmitStatusWeb BoardDescription商店规定:消费满n元,可以打八八折。设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:元),精确到分。Input输入只有一行,三个整数m、n和x,且0xmn1000。Output输出金额,精确到分。Sample Input95 300 4Sample Output334.40HINT了解浮点型的输出控制,注意整型和浮点型

2、混合运算过程中的数据类型转换。Append Code答案:#include int main()double m,n,x;double s; scanf(%lf%lf%lf,&m,&n,&x);s=m*x;sn?printf(%.2lf,s):printf(%.2lf,s*0.88);return 0;Problem B: 判断闰年Time Limit: 1 SecMemory Limit: 2 MBSubmit: 2524Solved: 1249SubmitStatusWeb BoardDescription输入一个正整数的年份,判断是否为闰年。Input输入只有一行,为一个10000以内的

3、正整数。Output输出为一行。若输入为闰年偶数则输出“Yes”,否则输出“No”。Sample Input2010Sample OutputNoHINT了解逻辑运算符和关系运算符。Append Code答案:#include int main() int x; scanf(%d,&x); x%4=0&x%100!=0|x%400=0?printf(Yes):printf(No); return 0;Problem C: 水仙花数Time Limit: 1 SecMemory Limit: 2 MBSubmit: 2505Solved: 1303SubmitStatusWeb BoardDes

4、cription如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。如:13+53+33=153。Input一个整数x,100=x=999。Outputx是水仙花数,则输出“YES”,否则为“NO”。Sample Input153Sample OutputYESHINTAppend Code答案:#include int main() int a,b,c,d; scanf(%d,&a); b=a/100; c=(a-b*100)/10; d=a-b*100-c*10; a=b*b*b+c*c*c+d*d*d?printf(YES):printf(NO); return 0;实验2

5、Problem A: 多少张钞票Time Limit: 1 SecMemory Limit: 2 MBSubmit: 1726Solved: 912SubmitStatusWeb BoardDescription 客户去商店买东西时,不超过100美金的账单喜欢用现金支付。商店喜欢用最少的钞票给付客户的找零。请你编写一个程序帮助商店计算出:当客户买了x元商品给了一张100美元的钞票后,商店应该付给客户多少张20美元、10美元、5美元和1美元的钞票,使得钞票总数最少。假设不存在其他面值的钞票,也不会有几角几分的价格,商店的各种钞票总是够用的。Input输入一个整数x,0x100。Output按顺序

6、输出20美金、10美金、5美金和1美金面值的钞票张数。输出格式见sample。Sample Input7Sample Output$20 bills: 4$10 bills: 1 $5 bills: 0 $1 bills: 3HINT当能支付大面值钞票时不要支付更小面值的钞票,才能满足钞票总数最少,注意scanf()格式的控制。Append Code答案:#include int main()int a,b,c,d,e,f,g,h,i;scanf(%d,&a);b=100-a;c=b/20;d=b-20*c;e=d/10;f=d-10*e;g=f/5;h=f-5*g;i=h/1;printf(

7、$20 bills: %dn$10 bills: %dn $5 bills: %dn $1 bills: %d,c,e,g,i);Problem B: 自动拨出电话的程序Time Limit: 1 SecMemory Limit: 2 MBSubmit: 1248Solved: 962SubmitStatusWeb BoardDescription 某外国销售公司需要向国内的一些大型单位打电话推销产品。这个公司的工作场景是这样推销员坐在自己电脑旁边,通过一款自动拨电话的软件与客户联系。所有需要被拨打的电话号码都事先存储在服务器上,推销员不需要每次都很麻烦的输入客户的电话号码,当推销员点击软件里

8、拨打的按钮,下一个电话将会自动拨出。 现在你需要编写个程序来模拟这个自动拨电话软件的工作过程。电话号码是按照中国的习惯存储下来的,可能是从网站上抓取的,也可能是扫描的手写件。不过它们都被按照这样的格式存储下来: (城市区号)分区前缀-分机号比如青岛的一个大型单位的某部电话是(0532)621-15486,是指如果在单位内部直接拨打15486就行,在青岛的其他地方要拨打62115486,而在北京要拨打053262115486。根据常识,先拨0就是要转外线,所以一般电话号码的各个部分都不会以0开头。 你的程序可以把如上格式的电话号码翻译成一个只包含有数字的串,发送给电话机并拨出。值得注意的是中国的

9、城市区号长度并不相同,比如北京是010。再有不同城市的电话号码位数也不相同,并且不同单位根据内部电话分机数目多少,有的可能只有3位分机号码,有的可能分区前缀号会只有2位。但不管怎样中国现在还没有哪个城市的电话号码超过十位数的。中国的国际区号是0086。 这里不含像114这样的特服电话。Input输入只有一行,是符合“(城市区号)分区前缀-分机号”规律的电话号码,这里面除了英文字符“(”、“)”、“-”之外只有数字。Output输出只有一行,是带中国区号的能电话号码。注意从国外打国内的电话,城市区号前面的0是不用拨打的。比如中国青岛的国际分区号是0086532。Sample Input(0532

10、)621-15486Sample Output008653262115486HINT这是个可以用scanf()解决的问题,请注意电话号码都是数字这个规律。Append Code答案:#include int main() int a,b,c; scanf(%d)%d-%d,&a,&b,&c); printf(0086%d%d%d,a,b,c);Problem C: 求1+2+.+n=?Time Limit: 1 SecMemory Limit: 2 MBSubmit: 5449Solved: 1121SubmitStatusWeb BoardDescription给定一个n,求出s = 1+2

11、+3+.+n的值。Input输入只有一行,包含一个正整数n(n=232)。Output输出一行,为1+2+.+n的值。Sample Input10Sample Output55HINTn的数据范围大,需注意数据类型的选择和计算次序,以避免数据溢出。Append Code答案:#include int main() unsigned long long int n,s; scanf(%llu,&n); if(n%2=0) s=n/2*(n+1); else s=(n+1)/2*n; printf(%llu,s);Problem D: 2的多少次幂Time Limit: 1 SecMemory L

12、imit: 2 MBSubmit: 2678Solved: 1397SubmitStatusWeb BoardDescription从键盘输入一个数x,x是2的整数次幂(x=2y),请编程求出y的值。Input一个非负有理数x,x在0,2256范围内。Output一个整数y。Sample Input1Sample Output0HINT看起来数据很大,但是用double完全可以存储。为什么?请研究下IEEE-754标准的浮点数存储格式。这里要用到C语言标准库的数学函数。Append Code答案:#include #include int main()double x,y;scanf(%lf,

13、&x);y=log10(x)/log10(2);printf(%.0lf,y);Problem E: 三个数比较大小Time Limit: 1 SecMemory Limit: 2 MBSubmit: 2815Solved: 1257SubmitStatusWeb BoardDescription从键盘上输入0100之间的三个数,按从小到大的顺序输出。Input输入只有一行,为三个整数。Output按从小到大输出这三个数。Sample Input15 10 20Sample Output10 15 20HINT用if语句判断各种情况可以解决这个问题。Append Code答案:#include

14、 int main()int x,y,z;scanf(%d %d %d,&x,&y,&z);if(xy)if(yz)printf(%d %d %d,z,y,x);else if(xz) printf(%d %d %d,y,z,x);elseprintf(%d %d %d,y,x,z);elseif(xz)printf(%d %d %d,z,x,y);elseif(yz)printf(%d %d %d,x,z,y);elseprintf(%d %d %d,x,y,z);实验3Problem A: 输出是m的倍数或n的倍数、但不是m和n的公倍数的数Time Limit: 1 SecMemory L

15、imit: 2 MBSubmit: 3745Solved: 1192SubmitStatusWeb BoardDescription输出1k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1=m,nk100,且m与n不相等。Input输入三个整数,依次为k、m、 n。Output从小到大输出符合题意的所有整数,两数之间用一个空格分开。Sample Input15 2 3Sample Output2 3 4 8 9 10 14 15HINT难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。Append Code答案:#include int main() int k

16、,m,n,num=1,x=0; scanf(%d %d %d,&k,&m,&n); while(num=k) if(num%m=0&num%n!=0)|(num%m!=0&num%n=0) x+; if(x=1) printf(%d,num); if(x!=1) printf( %d,num); num+; Problem B: n个数的最大值和最小值Time Limit: 1 SecMemory Limit: 2 MBSubmit: 2630Solved: 1263SubmitStatusWeb BoardDescription找出n个数中最大的数和最小的数,并将它们的值输出出来。Input

17、输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。Output输出为两行,格式见sample。Sample Input3 0 1 -1Sample OutputThe maximum number is 1.The minimum number is -1.HINT分隔符是空格还是回车都是空白符,对scanf(%d)来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。Append Code答案:#include int main()int n

18、,a,b,i=2,max,min;scanf(%d,&n);scanf(%d,&a);max=a;min=a;while(i=max)max=b;if(b=min)min=b;i+;printf(The maximum number is %d.nThe minimum number is %d.,max,min);return 0; Problem C: 成绩的等级Time Limit: 1 SecMemory Limit: 2 MBSubmit: 5225Solved: 2236SubmitStatusWeb BoardDescription把百分制的考试成绩转换成五级制的成绩:90100

19、:Excellent8089:Good7079:Average6069:Pass059:Failing不在0100之间的输入是非法数据,输出“Error”。Input输入多行,每行一个整数。Output输入所对应的成绩等级。Sample Input-18192356872100Sample OutputErrorGoodExcellentFailingPassAverageExcellentHINT用switch语句解决这个问题比较方便。Append Codeappend.cc, 答案:#include int main()int x;while(scanf(%d,&x)!=EOF)if(x1

20、00)printf(Error); elseswitch(x/10) case 10: case 9: printf(Excellent);break; case 8: printf(Good);break; case 7: printf(Average);break; case 6: printf(Pass);break; case 5: case 4: case 3: case 2: case 1: case 0: printf(Failing);break; default: printf(Error);break;printf(n);return 0;Problem D: A+B Pr

21、oblemTime Limit: 1 SecMemory Limit: 2 MBSubmit: 2221Solved: 1312SubmitStatusWeb BoardDescription计算a+b,0=a,b1000。Input输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。Output每行输出一个a+b的值,顺序与输入对应。Sample Input1 210 20Sample Output330HINTOJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctr

22、l+Z产生EOF。本题解法参看FAQ。Append Code答案:#include int main()int a,b,sum;while(scanf(%d%d,&a,&b)!=EOF)sum=a+b;printf(%dn,sum);return 0;Problem E: A+B Problem (II) : Input/Output PraticeTime Limit: 1 SecMemory Limit: 2 MBSubmit: 1710Solved: 1225SubmitStatusWeb BoardDescription计算a+b,0=a,b1000。Input输入的第一行是一个整数N

23、,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。Output每行输出一个a+b的和,顺序与输入对应。Sample Input21 210 20Sample Output330HINTN给出了测试样例数,用for循环处理方便。Append Code答案:#include int main()int a,b,N,i,sum;scanf(%d,&N);for(i=1;i=N;i+)scanf(%d %d,&a,&b);sum=a+b;printf(%dn,sum);return 0;实验4Problem A: A+B Problem (III) : Input/Output Pratic

24、eTime Limit: 1 SecMemory Limit: 2 MBSubmit: 1609Solved: 1076SubmitStatusWeb BoardDescription计算a+b,0=a,b1000。Input输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。Output每行输出一个a+b的值,顺序与输入对应。Sample Input1 210 200 0Sample Output330HINT练习break的使用。Append Code#include int main()int a1000,b1000,n,i;f

25、or(i=0;i+)scanf(%d %d,&ai,&bi);if(ai=0&bi=0)break; for(n=0;ni;n+) printf(%dn,an+bn); return 0;Problem B: A+B Problem (IV) : Input/Output PraticeTime Limit: 1 SecMemory Limit: 2 MBSubmit: 2199Solved: 1114SubmitStatusWeb BoardDescription计算a+b,0=a,b1000。Input输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。Output每行输出一个a

26、+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。Sample Input1 210 2015 35Sample Output33050HINT由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。Append Code答案:#include int main()int a,b;while(scanf(%d %d,&a,&b)!=EOF)printf(%dnn,a+b);Problem C: 只有一个二元运算符的表达式运算Time Limit: 1 SecMemory Limit: 2 MBSubmit: 2595Solved: 1006Submi

27、tStatusWeb BoardDescription编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。Input每行输入一个表达式,格式为:二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。测试样例不存在除数为0的情况。输入以a和b为0,且用一个空格分开结束。Output每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalid op”。Sample Input33+58*92.21-617/39%30 0Sample Ou

28、tput3872invalid op-550HINT教材上有非常相似的例题可以参考。Append Code答案:#include int main() int a,b; char c; scanf(%d%c%d,&a,&c,&b); for(;) if(c=+) printf(%dn,a+b); else if(c=-) printf(%dn,a-b); else if(c=*) printf(%dn,a*b); else if(c=/) printf(%dn,a/b); else if(c=%) printf(%dn,a%b); else if(c= &a=0&b=0) break; els

29、e printf(invalid opn); scanf(%d%c%d,&a,&c,&b); return 0;Problem D: 求100以内的素数Time Limit: 1 SecMemory Limit: 2 MBSubmit: 3015Solved: 1187SubmitStatusWeb BoardDescription素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。Input输入为两个整数m和n,满足0=m=n=100。Output从大到小输出mn之间的所有素数,一个素数一行。如果mn之间没有素数,则不输出任何数。输出的所有数在两行“=”之间。Sample

30、 Input2 12Sample Output=117532=HINT利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。Append Code答案:#include int main()int i,a,b;scanf(%d%d,&a,&b);printf(=n);for(i=b;i=a;i-)if(i%2!=0&i%3!=0&i%5!=0&i%7!=0&i!=1)printf(%dn,i);if(i=2|i=3|i=5|i=7)printf(%dn,i);printf(=n);Problem E: 十进制整数转二进制Time Limit: 1 SecMemory Limit:

31、2 MBSubmit: 2289Solved: 1084SubmitStatusWeb BoardDescription给出一个十进制的非负整数x,x=216,把它转换成二进制数输出。Input输入为多行,每行一个整数x,至读入EOF结束。Output每行输出x对应的二进制数值。Sample Input0133365535Sample Output01111000011111111111111111HINT本题有多种解法:可以用循环迭代对2的除法和取余操作,不过处理的顺序与输出顺序相反,需要利用数组存储;用取对数或从大到小减去2的整数次幂的方法计算与输出顺序是相同的;也可以用printf()把

32、十进制的数值处理成十六进制,然后1位十六进制转4位二进制;也可以用位运算处理。Append Code答案:#include int main()int a20,i,j;while(scanf(%d,&j)!=EOF)for(i=0;i+)ai=j%2;j=j/2;if(j=0)break;for(;i=0;i-)printf(%d,ai);printf(n);return 0;Problem F: 辗转相除法Time Limit: 1 SecMemory Limit: 2 MBSubmit: 2288Solved: 795SubmitStatusWeb BoardDescription辗转相除

33、法,也称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的几何原本(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的九章算术。两个整数的最大公约数(亦称公约数)是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252和105的最大公约数是21(252 = 21 12;105 = 21 5);因为252 105 = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最

34、大公约数。例如,计算a = 1071和b = 462的最大公约数的过程如下:从1071中不断减去462直到小于462(可以减2次,即商q0 = 2),余数是147: 1071 = 2 462 + 147.然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21: 462 = 3 147 + 21.再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数: 147 = 7 21 + 0.此时,余数是0,所以1071和462的最大公约数是21。Input输入为多行,每行有一对非负整数a,b,且a*b不会超出int类型的数据范围。输入至EOF结束。Ou

35、tput每行输出一对a,b的最大公约数和最小公倍数,顺序与输入对应。从数论上的整除定义出发:若a整除b(b除以a没有余数),则b是a的倍数,a是b的约数,这里要求b不为0。因此0是任意整数的倍数,但是0不能是约数。Sample Input1 12 32 23 24 67 512 618 924 36Sample Output1 11 62 21 62 121 356 129 1812 72HINT按照题目描述所给的算法解题,注意以下几点:辗转相除法对两个数的大小关系有要求,根据倍数和约数的数学定义,一个非0数和0的约数是多少?辗转相除法的计算过程是符合这种定义的。Append Code答案:#

36、include int main() int a,b,c,d,e,f; while(scanf(%d%d,&a,&b)!=EOF) if(ab) c=a; else c=b;if(ab)d=b;elsed=a; while(d!=0) e=c-d; if(de) c=d; else c=e;if(de)d=e;elsed=d; f=(a*b)/c; printf(%d %dn,c,f); 实验六Problem A: 简单的整数排序Time Limit: 1 SecMemory Limit: 2 MBSubmit: 2313Solved: 1143SubmitStatusWeb BoardDes

37、cription对给出的若干整数按从小到大排序。Input输入的第一个数为n(n=1000),后接n个整数。Output按从小到大的顺序输出这些整数,每两个整数之间用一个空格分隔开,最后一个整数后面没有空格。Sample Input10 3 9 1 5 2 8 5 6 7 3Sample Output1 2 3 3 5 5 6 7 8 9HINT排序前必须把所有的整数都存储下来。因为只有最多1000个数,1秒的时间足够任何排序算法运行处结果来。Append Code答案:#include int main()int a1000;int n,i,j,temp;scanf(%d,&n); for(

38、i=0;in;i+)scanf(%d,&ai);for(i=1;i=n-1;i+) for(j=0;jaj+1) temp=aj; aj=aj+1; aj+1=temp; for(i=0;in;i+)if(i=0)printf(%d,ai);else printf( %d,ai);return 0;Problem B: 兔子的繁殖问题Time Limit: 1 SecMemory Limit: 2 MBSubmit: 1944Solved: 1007SubmitStatusWeb BoardDescription假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)?这个问题是意大利数学家菲波那契(Fibonacci)在他1202年出版的算盘全书中提出来的,从第一对刚出生的小兔开始每月的兔子数被乘坐菲波那契序列。Input输入的第一个数为n,接下来有n个数字。每个数字为一个月份m(m=45)。Output输出为n行,每行为第m个月后的兔子总数。Sample Input61 2 3 4 5 10Sample Output1235889HINT当n较大时,菲波那契序列的第n项值和计算量都是很大的,可以先计算出菲波那契序列并用

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

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号