信息学奥林匹克竞赛辅导——程序设计试题答案部分 第1页
程序设计试题及答案
(备注:试题难度评价采取五★级评价体系,分基础、容易、一般、稍难、难五个等级。
其中的一、二、三★级都属于程序设计的基础试题级别,同学们稍加思考均有能力求得正确解答。
对于四★级试题属于程序设计试题基础级别的思考题.
五★级难度试题在此没有涉及,在程序设计高级试题中另行讲解。对于基础和容易两个级别的程序设计试题,若能够给出语句分类(如If条件语句、条件语句嵌套、循环语句、多重循环语句等)的将尽量给出。若属于13大类别的将尽量标注。)
程序设计试题几大分类:
1、素数类问题(求素数的几种算法): 2、数据排序问题(数据排序的几种方法): 3、最大公约数和最小公倍数问题(几种算法):
4、公式求解类问题(如求圆周率π、自然常数e、解方程等等): 5、编号相反处理问题:
6、约瑟夫问题(或猴子选大王问题、密码问题): 7、回文数问题:
8、高精度数值计算问题: 9、数值计算问题:
10、 进制相互转换问题: 11、 字符串倒置问题: 12、 排列与组合类问题:
13、 因子、质因子(质因数)类相关问题:
答案部分:
(程序设计的源程序没有统一的标准答案,实现程序的算法也是多种多样,但结果是唯一的,算法也有优劣之分,一个程序的优劣,关键在于是否找到了好的算法,以下程序和算法不一定就是最佳算法和最佳程序,只能仅供参考,希望同学们能够对某些程序提出更好的算法来改进程序) (经常碰到的判断是否为素数、是否为回文数、求两个数的最大公约数、求两个数的最小公倍数等问题的子函数源程序,请务必记住!)
①判断是否为素数,若是素数则返回true,若不是素数则返回false:
function prime(x:longint):boolean; var
j,y:longint; begin
prime:=true;
if x<2 then prime:=false; y:=trunc(sqrt(x)); for j:=2 to y do
if (x mod j = 0) then
begin prime:=false; exit; end;
信息学奥林匹克竞赛辅导——程序设计试题答案部分 第2页
end;
备注:1~100之间所有的素数: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:array[1..10] of integer; begin
if n<0 then begin huiwen:=false; exit; end; m:=n; i:=0; huiwen:=true; repeat i:=i+1;
a[i]:=m mod 10; m:=m div 10; until m=0;
for j:=1 to (i div 2) do if a[j]<>a[i-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、 求梯形的面积。(梯形面积公式:S?(★,测试数据①
1h(a?b)) 2?b?b2?4ac2、 求一元二次方程ax+bx+C=0的两个实根。(求根公式:x1,2?)
2a2
(★,测试数据a=1,b=-5,c=6;答案:x1=2、x2=3)
3、 输入一个三位的自然数,然后把这个数的百位与个位对调,输出对调后的结果。
(★)
4、 输入三个数a、b、c,首先判断这三个数能否构成三角形,若能,则求出三角形的面积。 (提示:海伦公式S?d(d?a)(d?b)(d?c),其中d?a?b?c,a、b、c为边长) 2(★,If条件语句,测试数据a=5,b=6,c=7;答案:14.7)
信息学奥林匹克竞赛辅导——程序设计试题答案部分 第3页
5、 从键盘读入三个数,按从大到小的顺序把它们打印出来。(★,If条件语句) 6、 输入三角形的三边,判断它是否是直角三角形。
(★,If条件语句,测试数据①3、4、5;②4、5、6;答案①Yes;②No) program ex7; var a,b,c:integer; begin
reanln(a,b,c);
if (a*a+b*b=c*c ) or ( b*b+c*c=a*a ) or (c*c+a*a=b*b ) then writeln(‘yes’) else writeln(‘no’); end.
7 编写一个根据用户键入的两个操作数和一个运算符,由计算机输出运算结果的程序。(★★★)
program ex71;
var a,b,s:integer;(real) begin
reanln(a,b); s:=a+b; writeln(s); end.
program ex72;
var a,b,s:integer;(real) begin
reanln(a,b); s:=a-b; writeln(s); end.
program ex73;
var a,b,s:integer;(real) begin
reanln(a,b); s:=a*b; writeln(s); end.
program ex74; var a,b,s:(real); begin
reanln(a,b); s:=a/b; writeln(s); end.
8 输入一个年号,判断它是否为闰年。
(★,If条件语句,测试数据①1900;②2000;③2008;答案:①No;②Yes;③Yes) program ex8; var a:integer;
信息学奥林匹克竞赛辅导——程序设计试题答案部分 第4页
begin readln(a);
if (a mod 4=0 ) and (( a mod 100 ) mod 400=0 ) then writeln(‘yes’) else writeln(‘no’); end.
9 编程计算S=1+2+3+?+100。(★,循环语句, 答案:5050)
program e; var I,s:integer; begin s:=0;
for i:=1 to 100 do s:=s+I; writeln(s); end.
相关练习:
(1)S?1?111????; 23100program e1;
var I:integer; s:real; begin s:=0;
for i:=1 to 100 do s:=s+1/I; writeln(s); end.
(2)S?1?2???100; program e2; var I,s:integer; begin s:=0;
for i:=1 to 100 do s:=s+I*i; writeln(s); end.
(3)S?2?4?6???100; program e3; var I,s:integer; begin s:=0;
for i:=1 to 50 do s:=s+I*2;
222信息学奥林匹克竞赛辅导——程序设计试题答案部分 第5页
writeln(s); end.
(4)S?1?4?7?10???100; program e; var I,s:integer; begin s:=0;
for i:=1 to 100 do if I mod 3=1 then s:=s+I; writeln(s); end.
(相关练习答案:(1)5.19(保留2为小数);(2)338350;(3)2550;(4)1717) a) 根据公式
?26?1?111????,计算圆周率的π值。 2232n2(★★,循环语句,测试数据n=10000;答案:3.1414971639)
program e; var i:longint; s:real; begin
writeln; s:=0;
for i:=1 to 10000 do s:=s+1/(i*i); writeln(sqrt(6*s)); end.
b) 计算n!。(n!=1×2×3×?×n,取n=10)
(★★,循环语句,10!=3628800) program e11; const n=10; var I,s:integer; begin s:=1;
for i:=1 to n do s:=s*i; writeln(s); end.
c) 已知一对兔子,每个月可以生一对小兔,而小兔过一个月后也可生一对小兔。即兔子的对数
是:第一个月1对,第二个月2对,第三个月3对,第四个月5对,??,假设兔子的生育期是12个月,并且不死,问一年后,这对兔子有多少对活着的后代?(Fibonacci数列问题) (★★,循环语句, 1、2、3、5、8、13、21、34、55、89、144、233;答案233)
program work(input,output); var i:integer;{循环变量}
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新自然科学(信息学奥赛辅导)程序设计试题汇编(答案) 全文阅读和word下载服务。
相关推荐: