1、信息学奥赛强化练习卷六 以下各题请分析问题,完善程序: 1. [题 目] 找出小于33的6个正整数,用这些整数进行加法运算,使得包括原来的整数在内能组成尽可能多的不同整数。 例如:用2,3,5这三个数能可组成下面的数 2, 3, 5 2 + 3 = 5, 但5已经存在 2 + 5 = 7, 3 + 5 = 8, 2 + 3 + 5 = 10 所以用2,3,5能组成6个不同的数。 [程序要求]:输出所选的这6个数,以及能组成不同整数的个数。
2、 [算法提要]:选择的这6个数,用来组成数时应该尽可能不重复,引入数组A保存找出的这6个整数。 程序:begin A[1] := 1; t := 0; For i := 2 to 6 do begin _____①____; for j := 1 to i - 1 do s := ______②_______; a[i] := _____
3、③_______; END; FOR i:=1 TO 6 DO begin T := ______④______ WRITE(a[i], ' '); END; Writeln('能组成不同整数的个数:', t) End. 答: ① s:=0; ② s:=s+a[j]; ③ a[i]:=s+1 ④ t:=t+a[i]; 或t:=t*2+1 分析:掌握程序中变量S的意义
4、是求解本题的关键。根据算法说明中提到的 “选择的这6个数,用来组成数时应尽可能不重复” 这一策略,同时,这6个数要小于33的限制条件,我们不妨假设前I-1个数a1,a2,a3,a4…ai-1 已找到,对第I 个数ai, 确定其值的原则为:(1)ai 要尽可能小且满足a1 5、1 6、组成不同整数的个数 t=a[1]+a[2]+a[3]+a[4]+a[5]+a[6], 所以④处应填 t+a[I ],得到累加和。
2. [题 目]
求出所有满足下列条件的二位数:将此二位数的个位数字与十位数字进行交换,可得到一个新的数,要求新数与原数之和小于100。
程序要求:每行输出6个满足条件的数。
[算法提要] 分解每一个二位数,然后重新组成一个新数,当满足条件时,用计数器来统计个数。
程序: K := 0;
FOR i := ______①____ TO 99 DO
7、 X := _____②_____; Y := _____③_____;
J := x * 10 + y;
IF ____④_____ THEN
K := k + 1;
Write(I : 4);
______⑤_____ THEN WRITELN;
ENDIF
8、 ENDFOR;
答:
① 10
② x:=i mod 10;
③ y:=i div 10;
④ If (i+j)<100
⑤ if k mod 6=0
3.[题 目]
设有N个不同整数的数列:例如N=4时,有4个不同整数的数列为17,4,16,5。数列中的第1个数17,比它后面的三个数都大,则称数17的逆数为3。数列中的第2个数4比它后面的数都小,则称数4的逆数为0。同时记数列中全部逆数的和称为数列的逆数。上例中,数列17,4,16,5的逆数:为3+0+1+0=4。
[ 9、程序要求] 当给出N个不同整数的数列后,求出此数列的逆数。
[算法描述] 为求得上面问题的解,设置数组A : ARRAY[1..N] OF INTEGER 和逆数计数器5,然后用一个二重循环求出数列的逆数。
[程 序]
CONST N=10;
VAR I,J,S:INTEGER;
A:ARRAY[1..N] OF INTEGER;
BEGIN
S:=0;
FOR I:=1 TO N DO READ(A[I]);
FOR I:=1 TO ① DO
FOR J:= ② TO N DO
10、 IF A[I]>A[J] THEN ③ ;
WRITELN('S=',S)
END.
答: ① N-1 ② I+1 ③ S:=S +1;
4.[题 目]
装球:设有n个盒子(n足够大,可装入任何数量的球),分别编号1,2,……。同时有k个小球(k>0),今将k 个小球装入到盒子中去。
装入规则如下:
(1) 第一个盒子不能为空。
(2) 装入必须严格按递增顺序进行。
例如,当k=8,n=6时,装入方法有1,2,5或1,3,4
(3) 在满足上面的两个条件下,要求有球的盒子尽可能多。
(4) 11、装完后,相邻盒子中球个数差的绝对值之和最小(未装的盒子不计)。
如上例中:
装入法1,2,5,则差的绝对值之和为2-1+5-2=4
装入法1,3,4,则差的绝对值之和为3-1+4-3=3
[程序要求] 给出k(k表示小球的个数)之后,求出满足上述四个条件的装入方法。
[算法描述] 设计一个数组A用数组元素代表盒子,然后依次装入小球。
[程序清单]
CONST N=20;
VAR I,J,K,L:INTEGER;
A:ARRAY[1..N] OF INTEGER;
BEGIN
READLN (K) ;
① ;
12、J:=1;
WHILE ② DO BEGIN
A[J]:=J; ③ ; J:=J+1
END;
L:=J-1;
WHILE K>0 DO BEGIN
④ ;
K:=K-1;
L:=L-1;
END;
FOR I:=1 TO ⑤ DO
WRITE(A[I]:4)
END.
答:① for I:=1 to n do A[I]:=0; ② K>A[J-






