程序设计试题汇编(答案)

上传人:文*** 文档编号:39992528 上传时间:2021-11-13 格式:DOC 页数:55 大小:347KB
收藏 版权申诉 举报 下载
程序设计试题汇编(答案)_第1页
第1页 / 共55页
程序设计试题汇编(答案)_第2页
第2页 / 共55页
程序设计试题汇编(答案)_第3页
第3页 / 共55页
资源描述:

《程序设计试题汇编(答案)》由会员分享,可在线阅读,更多相关《程序设计试题汇编(答案)(55页珍藏版)》请在装配图网上搜索。

1、真诚为您提供优质参考资料,若有不当之处,请指正。程序设计试题及答案(备注:试题难度评价采取五级评价体系,分基础、容易、一般、稍难、难五个等级,其中的一、二、三级都属于程序设计的基础试题级别,同学们稍加思考均有能力求得正确解答,对于四级试题属于程序设计试题基础级别的思考题,五级难度试题在此没有涉及,在程序设计高级试题中另行讲解。对于基础和容易两个级别的程序设计试题,若能够给出语句分类(如If条件语句、条件语句嵌套、循环语句、多重循环语句等)的将尽量给出。若属于13大类别的将尽量标注。)程序设计试题几大分类:1、 素数类问题(求素数的几种算法):2、 数据排序问题(数据排序的几种方法):3、 最大

2、公约数和最小公倍数问题(几种算法):4、 公式求解类问题(如求圆周率、自然常数e、解方程等等):5、 编号相反处理问题:6、 约瑟夫问题(或猴子选大王问题、密码问题):7、 回文数问题:8、 高精度数值计算问题:9、 数值计算问题:10、 进制相互转换问题:11、 字符串倒置问题:12、 排列与组合类问题:13、 因子、质因子(质因数)类相关问题:答案部分:(程序设计的源程序没有统一的标准答案,实现程序的算法也是多种多样,但结果是唯一的,算法也有优劣之分,一个程序的优劣,关键在于是否找到了好的算法,以下程序和算法不一定就是最佳算法和最佳程序,只能仅供参考,希望同学们能够对某些程序提出更好的算法

3、来改进程序)(经常碰到的判断是否为素数、是否为回文数、求两个数的最大公约数、求两个数的最小公倍数等问题的子函数源程序,请务必记住!) 判断是否为素数,若是素数则返回true,若不是素数则返回false:function prime(x:longint):boolean; var j,y:longint; begin prime:=true; if x2 then prime:=false; y:=trunc(sqrt(x); for j:=2 to y do if (x mod j = 0) then begin prime:=false; exit; end; end;备注:1100之间所有

4、的素数:2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89、97。(共25个) 判断是否为回文数,若是回文数则返回true,若不是回文数则返回false:function huiwen(n:longint):boolean; var m,i,j:longint; a:array1.10 of integer; begin if n0 then begin huiwen:=false; exit; end; m:=n; i:=0; huiwen:=true; repeat i:=i+1; ai:=m mod 10

5、; m:=m div 10; until m=0; for j:=1 to (i div 2) do if ajai-j+1 then begin huiwen:=false; exit; end; end;求最大公约数子函数,返回两个正整数的最大公约数,采用辗转相除法算法;function gcd(a,b:longint):longint; begin if b=0 then gcd:=a else gcd:=gcd(b,a mod b); end; 求最小公倍数:lcm=a*b div gcd(a,b);(以下程序设计试题来自奥赛经典(语言篇)第2章 基本语句与程序结构例题部分:1、 求梯

6、形的面积。(梯形面积公式:)(,测试数据2、 求一元二次方程ax2bxC0的两个实根。(求根公式:)(,测试数据a1,b5,c6;答案:x12、x23)3、 输入一个三位的自然数,然后把这个数的百位与个位对调,输出对调后的结果。() 4、 输入三个数a、b、c,首先判断这三个数能否构成三角形,若能,则求出三角形的面积。(提示:海伦公式,其中,a、b、c为边长)(,If条件语句,测试数据a5,b6,c7;答案:14.7)5、 从键盘读入三个数,按从大到小的顺序把它们打印出来。(,If条件语句)6、 输入三角形的三边,判断它是否是直角三角形。(,If条件语句,测试数据3、4、5;4、5、6;答案Y

7、es;No)7、 编写一个根据用户键入的两个操作数和一个运算符,由计算机输出运算结果的程序。()8、 输入一个年号,判断它是否为闰年。(,If条件语句,测试数据1900;2000;2008;答案:No;Yes;Yes)9、 编程计算S123100。(,循环语句, 答案:5050)相关练习:(1);(2);(3);(4);(相关练习答案:(1)5.19(保留2为小数);(2)338350;(3)2550;(4)1717)10、 根据公式,计算圆周率的值。(,循环语句,测试数据n10000;答案:3.1414971639)program e;var i:longint; s:real;begin

8、writeln; s:=0; for i:=1 to 10000 do s:=s+1/(i*i); writeln(sqrt(6*s);end.11、 计算n!。(n!123n,取n10)(,循环语句,10!3628800)12、 已知一对兔子,每个月可以生一对小兔,而小兔过一个月后也可生一对小兔。即兔子的对数是:第一个月1对,第二个月2对,第三个月3对,第四个月5对,假设兔子的生育期是12个月,并且不死,问一年后,这对兔子有多少对活着的后代?(Fibonacci数列问题)(,循环语句, 1、2、3、5、8、13、21、34、55、89、144、233;答案233)13、 求两个整数a与b的最

9、大公约数和最小公倍数。(,循环语句、If条件语句,测试数据16和24,最大公约数8,最小公倍数48)14、 利用格利高公式求。,直到最后一项的值小于106为止。(,循环语句)(答案:3.1415946569E+00)program e2_32;var n,fh:longint; s,t,p:real;begin writeln; n:=1; s:=0; t:=1; fh:=1; while (abs(t)=1e-6) do begin t:=fh/n; s:=s+t; n:=n+2; fh:=-fh; end; p:=4*s; writeln(pi=,p);end.相关练习:利用公式,求。(计

10、算前10000项时,答案为3.1415426536)program e;var i,a,b:longint; x,s:real;begin writeln; s:=0; for i:=1 to 10000 do begin a:=(4*i-3); b:=(4*i-1); s:=s+1/(a*b); end; writeln(8*s);end.15、 求100999中的水仙花数。(若三位数ABC,ABCA3B3C3,则称ABC为水仙花数。例如153,135333153,则153是水仙花数。)(,循环语句)(答案:153、370、371、407)program e12;var i,a,b,c:in

11、teger;begin writeln; for i:=100 to 999 do begin a:=i div 100; b:=(i mod 100) div 10; c:=i mod 10; if i=a*a*a+b*b*b+c*c*c then write(i:8); end;end.16、 试编写能够打印输出如下图形的程序。(,循环语句)AAAAAAAAA AAAAAAA AAAAA AAAAprogram e;const n=5;var i,j:integer;begin writeln; for i:=1 to n do begin write(:i); for j:=1 to (

12、n-i)*2+1 do write(A); writeln; end;end.17、 四个学生上地理课,回答我国四大淡水湖大小时这样说:()甲:“最大洞庭湖,最小洪泽湖,鄱阳湖第三。”乙:“最大洪泽湖,最小洞庭湖,鄱阳湖第二,太湖第三。”丙:“最小洪泽湖,洞庭湖第三。”丁:“最大鄱阳湖,最小太湖,洪泽湖第二,洞庭湖第三。”对于每个湖的大小,每个学生仅答对一个,请编程确定四个湖的大小。习题部分:1、 已知三角形的两边a、b和夹角jc的值,求第三边(已知条件由键盘输入)。()(提示:余角公式)(测试数据:输入a3、b4、jc90;输出5)program e2_5;var a,b,c,jc:real

13、;begin writeln(input a,b,jc:); readln(a,b,jc); c:=sqrt(a*a+b*b-2*a*b*cos(pi*jc/180); writeln(c:8:2);end.2、 编写程序把一个四位整数3581颠倒成1853。()program e;const n=3581;var a,b,c,d:integer;begin writeln; a:=n mod 10; b:=(n div 10) mod 10; c:=(n div 100) mod 10; d:=n div 1000; writeln(a,b,c,d);end.相关练习:任意输入一个正整数,颠

14、倒输出该数。program e;var n:longint;begin writeln; writeln(input a integer number:); readln(n); repeat write(n mod 10); n:=n div 10; until n=0;end.3、 输入a、b、c三个数,打印出最大者。(,If条件语句)program e;var a,b,c:real;begin writeln(input three number for a,b,c:); readln(a,b,c); if (ab)and(ac) then writeln(a); else if (ba

15、)and(bc) then writeln(b); else writeln(c);end.4、 从键盘读入两个数,比较其大小,把大数置于x,小数置于y。请设计实现该功能的程序。(,If条件语句)(程序略)5、 输入三个数,判断以这三个数为边能否组成一个三角形。若不能,则给出适当信息;若能,则进一步判断它们构的是锐角三角形、直角三角形还是钝角三角形,并输出其特征(等边、等腰、直角、一般)、求其面积。(,If条件语句)(算法分析:对于判断是锐角、直角、还是钝角三角形,只需判断最大边的平方与其余两边的平方和的大小比较即可,小于则为锐角、等于则为直角、大于则为钝角。)(测试数据:1、2、3;3、4、

16、5;)4、4、7;5、5、5;答案:No;直角、面积6.00;钝角、等腰、面积6.78;锐角、等边、面积10.83)program e;var a,b,c,t,s,d,ja,jb,jc:real;begin writeln(input three number for a,b,c:); readln(a,b,c); if ab then begin t:=a; a:=b; b:=t; end; if ac then begin t:=a; a:=c; c:=t; end; if (ab+c) then begin if (a*ab*b+c*c) then writeln(rui jiao sa

17、n jiao xing.) else if(a*a=b*b+c*c) then writeln(zhi jiao san jiao xing.) else writeln(dun jiao san jiao xing.); if (a=b)and(b=c)and(c=a) then writeln(deng bian san jiao xing.) else if (a=b)and(bc)or(a=c)and(cb)or(b=c)and(ca) then writeln(deng yao san jiao xing.) else if (a*ab*b+c*c) then writeln(yi

18、ban san jiao xing.); d:=(a+b+c)/2; s:=sqrt(d*(d-a)*(d-b)*(d-c); writeln(s=,s:0:2); end else writeln(NO!);end.6、 设我国目前的人口为11亿,且每年的增长率为1.5。问多少年后,我国的人口会翻一番?()(答案:47)program e2_22;var i:integer; s:real;begin writeln; s:=11; i:=0; while s22 do begin s:=s*(1.015); inc(i); end; writeln(i);end.7、 Fibonacci数

19、列问题:数列的头两个数分别是0和1,从第三个数开始,每个数皆为它的前两个数之和,即:0,1,1,2,3,5,输出该数列的第50个数。(,循环语句)(答案:7778742049)program e;$N+,E+var i:integer; x,y,z:extended;begin writeln; x:=0; y:=1; write(x:20:0,y:20:0); for i:=3 to 50 do begin z:=x+y; write(z:20:0); x:=y; y:=z; end;end.8、 编写程序求出下式中n的最大值:224262n21500。(,循环语句)(答案:18)progr

20、am e2_24;var n,s:integer;begin writeln; s:=0; n:=0; while s1500 do begin inc(n,2); inc(s,n*n); end; writeln(n-2);end.9、 把一元的钞票换成一分、二分和五分的硬币(每种至少一枚),问有多少种兑换方法?()(答案:461)program e2_29;var i,j,k,ans:integer;begin ans:=0; for k:=1 to 19 do for j:=1 to 47 do for i:=1 to 93 do if (k*5+j*2+i)=100 then inc(

21、ans); writeln(ans);end.10、 编写程序求最小正整数m、n(0n0 then inc(count); until(x=0); writeln(count=,count);end.12、 求自然常数的值。(提示:0!1,1!1)()(1) 直到第50项;(2)直到最后一项小于105。(答案:(1)2.71828182845905E+0000;(2)2.71828152557319E+0000)(备注:第2小问程序略,只须将更改语句“until (1/s)aj+1 then begin t:=aj; aj:=aj+1; aj+1:=t; end; for i:=1 to n

22、do write(ai:5);end.2、 折半查找。(二分法查找)()3、 旅馆里有一百个房间,从1到100编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”,以后每个服务员都是如此。问第100个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)()(提示:对于任何一个编号,例如8,它的因子只有1、2、4、8,并且成对出现,当此数的因子数为偶数个时将被关上,当此数的因子数为奇数个时才会被打开。考虑到因子成对出现的情况,因此只有平方数的因子是奇数个的,所以

23、门被打开的只能是平方数的房间,如1,4等)4、 编写程序把任意十进制整数转换成二进制整数。()5、 所谓“幻方”,是一个行、列为奇数的方阵,把1n2这n2个不同的数放入方阵中,使方阵的每行、每列和每个对角线上的元素的和全部相等。下面给出幻方的一种排列方法:(1) 先把1放在第一行的中间位置;(2) 下一个数放在上一个数的右上方;(3) 若右上方已超出方阵的第一行,则下一个数放在下一列的最后一行上;(4) 若右上方已超出方阵的最后一列,则下一个数放在上一行的第一列上;(5) 若右上方已经有数,或右上方已超出方阵的第一行最后一列,则下一个数放在上一个数的正下方。编写程序,对输入小于15的n,打印出

24、相应的幻方。()6、 在一个字符数组LET中形成由A开始的连续26个大写字母构成的字串,并将其倒置后仍放在LET中。7、 随机输入一个长度不超过255的字符串,将其倒置后输出。8、 随机输入一些国家的英文名字,以end作为输入结束标志,按字母顺序排序后输出。9、 求n个字符串的最长公共子串,n20,字符长度不超过255。例如n3,由键盘依次输入三个字符串为:what is local bus?Name some local bus.Local bus is high speed I/O bus close to the processor.则最长公共子串为“local bus”。10、 文本的

25、整版。编写一个程序,从键盘以任意的方法输入句子,然后打印出来。打印时每行宽度必须为n个字符。如果一行的最后一个单词超出了本行n个字符的范围,则应把它移到下一行去。输入一个句子测试你的程序。习题部分:1、 输入n个整数,请找出最小数所在的位置,并把它与第一个数对调。()program e4_2;var a:array1.10of integer; i,t,y:integer;begin writeln(input ten integer number:); for i:=1 to 10 do read(ai); t:=a1; for i:=2 to 10 do if ait then t:=ai

26、; for i:=1 to 10 do if ai=t then begin writeln(the min number is ,i,th); ai:=a1; a1:=t; end; for i:=1 to 10 do write(ai:8);end.2、 用边排序边合并的方法把两个有序数列合并为一个新的有序数列,不得先合并再重新排序。()(测试数据:这里a组数据共8个:1 1 3 6 6 7 9 10;b组数据共5个:0 1 2 3 4)program e4_3;var a:array1.8 of integer; b:array1.5 of integer; c:array1.13 of

27、 integer; i,j,k,m,n:integer;begin writeln(input 8 integer number of square arrayA:); for i:=1 to 8 do read(ai); writeln(input 5 integer number of square arrayB:); for i:=1 to 5 do read(bi); j:=1; k:=1; m:=aj; n:=bk; for i:=1 to 13 do begin if mn then flag:=true else inc(i); until flag=true; for j:=9

28、 downto i+1 do aj:=aj-1; ai:=n; for i:=1 to 9 do write(ai:4);end.4、 有N个无序的数存放在A数组中,请将后面相同的数删成只剩下一个,并输出经过删除后的数列。()(测试数据:数列为1 3 5 3 7 5 3 1;答案:1 3 5 7)program e4_5;var a:array1.8 of integer; i,j,n:integer;begin writeln(input 8 integer number:); for i:=1 to 8 do read(ai); for i:=2 to 8 do for j:=1 to i

29、-1 do if ai=aj then ai:=maxint; for i:=1 to 8 do if aimaxint then write(ai:4);end.5、 有N个人排队到R个相同的水龙头去打水,他们装满各自水桶的时间T1、T2、TN为整数且互不相等,应如何安排他们打水的顺序才能使他们花费的总时间最少?(花费的总时间等于每个花费时间的总和)6、 求一个五阶方阵中某个元素的位置:它在行上是最小的,在列上也是最小的,如果没有请输出“NO FIND!”。()(分析:整个矩阵中的最小值,当然也是所在行和所在列的最小值,因此肯定能找到这样的数)测试数据:答案:2、1、3、6114278592

30、31253222118151716241261310192014program e;var i,j,x,y:integer; minx:integer; a:array1.5,1.5 of integer;begin writeln; writeln(input number(5*5):); for i:=1 to 5 do for j:=1 to 5 do read(ai,j); for i:=1 to 5 do begin minx:=ai,1; x:=i; y:=1; for j:=1 to 5 do if ai,jminx then begin minx:=ai,j; y:=j; en

31、d; for j:=1 to 5 do if aj,y30000; writeln(maxe=,a, count=,n-2);end.2. 计算并输出:之值(精确到小数点后第5位)。()(答案:0.99900)program e;var i:integer; s,n:real;begin writeln; s:=0; for i:=1 to 1000 do begin n:=i; s:=s+1/(n*(n+1); end; writeln(s:0:5);end.3. 已知,求:()(1) F(50);(2)F(0)F(1)F(50)。(答案:212101;97262)program e;var

32、 i,a,b,c,d,s:longint;begin writeln; a:=1; b:=1; c:=1; s:=3; for i:=3 to 50 do begin d:=a-2*b+c; s:=s+d; a:=b; b:=c; c:=d; write(d:8); end; writeln; writeln(s=,s);end.4. 求满足:AB716699并且AB最小两个条件的A和B。()(答案:A563;B1273)program e;var a,x,s,mina,minb:longint;begin writeln; s:=716699; x:=trunc(sqrt(716699);

33、for a:=1 to x do if (716699 mod a=0)and(a+(716699 div a)s) then begin s:=a+(716699 div a); mina:=a; minb:=(716699 div a); end; writeln(A=,mina, B=,minb);end.5. 一自然数平方的末几位与该数相同时,称此数为自同构数。例如,由于5225,则称5为自同构数。求出1,700以内的:(1)最大的自同构数;(2)自同构数数目。()(答案:625)7)program e;var i,count:longint;begin writeln; count:

34、=0; for i:=1 to 9 do if (i*i-i) mod 10=0 then inc(count); for i:=10 to 99 do if (i*i-i) mod 100=0 then inc(count); for i:=100 to 700 do if (i*i-i) mod 1000=0 then begin inc(count); write(i:8); end; writeln; writeln(count=,count);end.6. 若某不含数字0的三位正整数,其平方数至少有三位同样的数字,则称该三位数为三重数。例如,由于:5112261121(有三位1),所

35、以511为三重数。求出:()(1)按升序排列第10个三重数;(2)按升序排列前10个三重数之和;(答案:(1)258;(2)1826)program e1;var i,j,k,a,b,c,x,n,count,s:longint; aa:array1.5of integer;begin writeln; s:=0; count:=0; for i:=111 to 316 do begin a:=i div 100; b:=(i div 10) mod 10; c:=i mod 10; if (a0)and(b0)and(c0) then begin x:=i*i; aa1:=x div 1000

36、0; aa2:=(x div 1000) mod 10; aa3:=(x div 100) mod 10; aa4:=(x div 10) mod 10; aa5:=x mod 10; for j:=1 to 3 do begin n:=1; for k:=j+1 to 5 do if aaj=aak then n:=n+1; if n2 then begin writeln(i:8,x:8); s:=s+i; count:=count+1; break; end; end; end; if count=10 then break; end; writeln(s:8);end.7. 满足下列两

37、个条件:(a)千位数字与百位数字相同(非0),十位数字与个位数字相同;(b)是某两位数的平方。的四位正整数称为四位平方数。例如,由于:7744882,则称7744为四位平方数。求出:(1)所有四位平方数的数目;(2)所有四位平方数之和。()(分析:最小四位数1000是31.6的平方,最大的四位数9999是99.9的平方)(答案:1;7744)program e;var i,x,count,s:longint;begin writeln; count:=0; s:=0; for i:=32 to 99 do begin x:=i*i; if (x div 1000)=(x div 100) mo

38、d 10)and(x div 10) mod 10)=(x mod 10) then begin inc(count); s:=s+x; end; end; writeln(count=,count, s=,s);end.8. 其平方等于某两个正整数平方之和的正整数称为弦数。例如,由于324252,因此5为弦数。求121,130之间:(1)弦数数目;(2)最小的弦数;(3)最大的弦数。()(分析:设a2b2c2,且ay)and(x*x+y*y+z*z=51*51) then if (x+y+zmaxs)or(x+y+z)=maxs) then begin maxs:=x+y+z; xx:=x;

39、 yy:=y; zz:=z; end; end; writeln(x=,xx, y=,yy, z=,zz);end.10. 计算(精度104)(a=0.1、x=1.0)。()(答案:0.0295)program e;var y,a,x:real;begin writeln; a:=0.1; x:=1.0; y:=(exp(a*x)-exp(-a*x)/2*sin(x+a)+a*ln(x+a)/2); writeln(y:0:4);end.11. 倒勾股数是满足下列公式:(设ABC)的一组(3个)整数(A、B、C),例如(156,65,60)是倒勾股数,因为。问:()(1)A、B、C之和小于100的倒勾股数有多少组?(2)满足(1)的诸组中,A、B、C之和最小的是哪组?(提示:把公式转化为A2B2C2(A2B2)(答案:2;a20,b15,c12)program e;var a,b,c,count,mins,mina,minb,minc:longint;begin writeln; count:=0; mins:=100; for c:=1 to 33 do for b:=c+1 to 49 do for a:=b+1 to 97 do if (a*a*b*b=c*c*(a*a+b*b)and(a+b+

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!