当前位置:首页 > (信息学奥赛辅导)程序设计试题汇编(答案)
信息学奥林匹克竞赛辅导——程序设计试题答案部分 第9页
10、文本的整版。编写一个程序,从键盘以任意的方法输入句子,然后打印出来。打印时每行宽度必须为n个字
符。如果一行的最后一个单词超出了本行n个字符的范围,则应把它移到下一行去。输入一个句子测试你的程序。
习题部分:
1、 输入n个整数,请找出最小数所在的位置,并把它与第一个数对调。 (★)
program e4_2; var
a:array[1..10]of integer; i,t,y:integer; begin
writeln('input ten integer number:'); for i:=1 to 10 do read(a[i]); t:=a[1];
for i:=2 to 10 do if a[i] if a[i]=t then begin writeln('the min number is ',i,'th'); a[i]:=a[1]; a[1]:=t; end; for i:=1 to 10 do write(a[i]: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:array[1..8] of integer; b:array[1..5] of integer; c:array[1..13] of integer; i,j,k,m,n:integer; begin writeln('input 8 integer number of square arrayA:'); for i:=1 to 8 do read(a[i]); writeln('input 5 integer number of square arrayB:'); for i:=1 to 5 do read(b[i]); j:=1; k:=1; m:=a[j]; n:=b[k]; for i:=1 to 13 do begin if m c[i]:=m; inc(j); m:=a[j]; if j=9 then m:=maxint; end else begin c[i]:=n; inc(k); n:=b[k]; if k=6 then n:=maxint; end; end; for i:=1 to 13 do write(c[i]:4); end. 3、 将一个数插入到有序的数列中,插入后数列仍然有序。 (★★) (测试数据:有序数组为1 1 3 6 6 7 9 10; 待插入数为5) program e4_4; var i,j,n:integer; flag:boolean; a:array[1..9] of integer; begin writeln('input 8 integer square number:'); for i:=1 to 8 do read(a[i]); writeln('input a integer number to insert:'); readln(n); flag:=false; i:=1; repeat (★★) 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第10页 if a[i]>n then flag:=true else inc(i); until flag=true; for j:=9 downto i+1 do a[j]:=a[j-1]; a[i]:=n; for i:=1 to 9 do write(a[i]:4); end. 4、 有N个无序的数存放在A数组中,请将后面相同的数删成只剩下一个,并输出经过删除后的数列。 (★★) (测试数据:数列为1 3 5 3 7 5 3 1; 答案:1 3 5 7) program e4_5; var a:array[1..8] of integer; i,j,n:integer; begin writeln('input 8 integer number:'); for i:=1 to 8 do read(a[i]); for i:=2 to 8 do for j:=1 to i-1 do if a[i]=a[j] then a[i]:=maxint; for i:=1 to 8 do if a[i]<>maxint then write(a[i]:4); end. 5、 有N个人排队到R个相同的水龙头去打水,他们装满各自水桶的时间T1、T2、?、TN为整数且互不相等, 应如何安排他们打水的顺序才能使他们花费的总时间最少?(花费的总时间等于每个花费时间的总和) 6、 求一个五阶方阵中某个元素的位置:它在行上是最小的,在列上也是最小的,如果没有请输出“NO FIND!”。 (★★★) (分析:整个矩阵中的最小值,当然也是所在行和所在列的最小值,因此肯定能找到这样的数)测试数据: 答案:2、1、3、6 11 4 2 7 8 5 9 23 1 25 3 22 21 18 15 17 16 24 12 6 13 10 19 20 14 program e; var i,j,x,y:integer; minx:integer; a:array[1..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(a[i,j]); for i:=1 to 5 do begin minx:=a[i,1]; x:=i; y:=1; for j:=1 to 5 do if a[i,j] if a[j,y] if j=5 then writeln('the number is ',minx,'[',x,']','[',y,']'); end; end. 第5章 过程与函数 例题部分: 1、 编程求:1!+3!+5!+7!+9!+11!。 2、 求数字的乘积根。一个正整数的数字的乘积N的定义是:这个整数中非零数字的乘积。例如,整数999的数 字乘积为9×9×9,即729。729的数字乘积为7×2×9,即126。126的数字乘积为1×2×6,即12。12的数字乘积为1×2,即2。一个正整数的数字乘积根N是这样得到的:反复取该整数的数字乘积,直到得到一位数字为止。例如,在上面的例子中数字的乘积根是2。编写一个程序,输入一个正整数(长度不超过200位数 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第11页 字),输出计算其数字乘积根的每一步结果。 3、 汉诺(Hanoi)塔问题。设有n个大小不等的中空圆盘,按照从小到大(尺寸和序号)的顺序叠套在立柱A上。 另有两根立柱B和C,如图所示。问题要求把全部圆盘从A柱(源柱)移到C柱(目标柱)。移动过程中可借助B柱(中间柱)。移动时有如下要求: (1) 一次只能移动一个圆盘; (2) 不允许把大盘放在小盘上边; (3) 可使用任意一根立柱暂存圆盘。 A B C 4、 把一个十进制整数转化为K进制数(K≤10)。 5、 八皇后问题:把八个皇后摆在8×8国际象棋棋盘格子内,使它们互不捕获对方。换言之,在任何一行、一列 或一条对角线上,仅能放置一个皇后。这一问题是由19世纪著名数学家高斯(Gauss)于1850年首先提出的。(答案共有92种解答) 6、 已知:切比雪夫多项式如下: (提示:运用递归函数计算) (n?0)?1?Tn(x)??x(n?1) ?2xT(x)?T(x)(n?2)n?1n?2? 对给定的不同的正整数,它是一些阶数不同的多项式,编程计算第n个多项式的值。 习题部分: M1、 编写一递归函数说明,用以计算组合数C(M,N)。(即CN) 2、 两个人玩井字游戏,在井字进分的九个空位上轮流画O或*,谁最先使自己的三个O或三个*在一条直线上, 谁就赢了。编写程序检查每一步是否走得正确,并告诉谁是胜利者。 第6章 集合与记录类型 例题部分: 1、 七段数码管问题。 2、 任意给出一个正整数N,找一个正整数M,使得N*M的值的数字由0、1、?、C(C≤9)组成,且这些数字 至少出现一次。编写程序在整数范围内找出满足条件的最小M。若没有给出信息,则输出“No find!”。 例如:C=3、N=65时,M=48,65×48=3210; C=8、N=125时,“No find!”。 (以下程序设计试题来自《计算机二级考试复习指南》) ?e(1)?e(2)?1,1. 数列?称为e数列, e(n)?(n?1)?e(n?1)?(n?2)?e(n?2)(n?2)? (★★) 每一个e(n)(n=1,2,?)称为e数。求[1,30000]之内: (1) 最大的e数;(2)e数的数目。 (该数列前面几项为1、1、3、11、53、??; 答案:①16687; ②8) program e; var a,b,c,n:longint; begin writeln; n:=3; a:=1; b:=1; repeat c:=(n-2)*a+(n-1)*b; a:=b; b:=c; inc(n); until c>30000; writeln('maxe=',a,' count=',n-2); end. 信息学奥林匹克竞赛辅导——程序设计试题答案部分 第12页 10002. 计算并输出:S?1之值(精确到小数点后第5位)。 ?i?1i?(i?1) (★) (答案: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. 已知??F(0)?F(1)?F(2)?1?F(N)?F(N?1)?2F(N?2)?F(N?3)(N?2),求: (★★) (1) F(50);(2)F(0)+F(1)+??+F(50)。 (答案:①212101; ②-97262) program e; var 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. 求满足:A·B=716699并且A+B最小两个条件的A和B。 (★★★) (答案:A=563; B=1273) program e; var a,x,s,mina,minb:longint; begin writeln; s:=716699; x:=trunc(sqrt(716699)); for a:=1 to x do if (716699 mod a=0)and(a+(716699 div a) begin s:=a+(716699 div a); mina:=a; minb:=(716699 div a); end; writeln('A=',mina,' B=',minb); end. 5. 一自然数平方的末几位与该数相同时,称此数为自同构数。例如,由于52=25,则称5为自同构数。求出[1,700] 以内的:(1)最大的自同构数;(2)自同构数数目。 (★★) (答案:①625 ②)7) program e; var i,count:longint; begin writeln; count:=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的三位正整数,其平方数至少有三位同样的数字,则称该三位数为三重数。例如,由于:5112=261121 (有三位1),所以511为三重数。求出: (★★★★)
共分享92篇相关文档