没有合适的资源?快使用搜索试试~ 我知道了~
首页全国信息学奥赛1995~2004年分类试题汇编完善程序
资源详情
资源评论
资源推荐

1.【问题描述】求出所有满足下列条件的二位数:将此二位数的个位数字与十位数字进
行交换,可得到一个新的数,要求新数与原数之和小于 100。
【程序要求】每行输出 6 个满足条件的数。
【算法提要】分解每一个二位数,然后重新组成一个新数,当满足条件时,用计数器来统
计个数。
【程序】 k:=0;
for i:=______①____ to 99 do
x:=_____②_____; y:=_____③_____;
j:=x*10+y;
if ____④_____
then k := k + 1;
write(i : 4);
______⑤_____ then writeln;
endif
endfor;
2.【问题描述】找出小于 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 个数,以及能组成不同整数的个数。
【算法提要】选择的这 6 个数,用来组成数时应该尽可能不重复,引入数组 A 保存找出
的这 6 个整数。
【程序】 a[1]:=1; t:=0;
for i:=2 to 6 do _____①____;
for j:=1 to i-1 do s:=______②_______;
endfor;
a[i]:=_______③_______;
endfor;
for i:=1 to 6 do t := ______④______ write(a[i], ' ');
endfor;
writeln('能组成不同整数的个数:', t)
end.
3.【问题描述】求出 2~1000 之间长度最长的、成等差数列的素数(质数)。
例如:在 2~50 之间的全部素数有
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47
其中,公差为 1 的素数数列为 2,3,其长度为 2

公差为 2 的素数数列为 3,5, 7,其长度为 3
……
【程序要求】输出满足条件的素数数列。
【算法提要】首先用筛选法求出此范围内的全部素数,存放在数组 B 中,然后用 2 个变
量 i,j,逐步求出满足条件的素数数列。
【程序】 max:=0; num:=1000;
for i:=2 to num do b[i]:= i; endfor
for i:=2 to ______①______ do
if _____②_____
then k := i + i;
while k<=num do
b[k]:=0;
k:=k+i
endwhile;
endif;
endfor;
for i:=2 to num-1 do
if _______③_________ then
j:=1;
d[j]:=b[i];
for i1:=_________④____________ do
if b[i1]<>0 then
delta:=_______⑤_______;
k:=delta;
while (i+k<=num) and _____⑥______ do
j:=j+1; d[j]:=i+k; k:=k+delta
endwhile;
if j>max
then begin max:=j;
c:=d //数组 d 的每个元素值分别送放数组 c
的相应元素中去//
endif;
j:=1
endif;
endfor;
endif;
endfor;
writeln('the max length is: ', max); write('the string is: ');
for i := 1 to max do write(c[i],' '); writeln endfor;

4.【问题描述】求出二个整形数组错位相加的最大面积。
(1)数组面积的定义:(限定数组头尾不为 0)
设有一个数组 C=(4,8,12,0,6)
则 C 的面积为:
Sc=(4+8)/2 + (8+12)/2 + 12/2 + 6/2
也就是说,Sc=各梯形面积之和(其中梯
形的高约定为 1,三角形作为梯形的特殊情况
处理)。
又如 D=(12, 24, 6)时,其面积的定义为 Sd=(12+24)/2 + (24+6)/2
(2)数组错位相加的定义
设有 2 个正整数的数组 a,b,长度为 n,当 n=5 时:
a=(34,26,15,44,12) b=(23,46,4,0,18)
对 a、b 进行错位相加,可能有下列情况
34 26 15 44 12
+) 23 46 4 0 18
34 26 15 44 12 23 46 4 0 18
或:
34 26 15 44 12
+ ) 23 46 4 0 18 -
34 26 15 44 35 46 4 0 18
或:
34 26 15 44 12
+ ) 23 46 4 0 18
34 26 15 67 58 4 0 18
或:……
最后有:
34 26 15 44 12
+) 23 46 4 0 18 -
23 46 4 0 18 34 26 15 44 12
可以看到:由于错位不同,相加的结果也不同。
【程序要求】找出一个错位相加的方案,使得输出的数组面积为最大。
【算法提要】设 a,b 的长度为 10,用 a,b: array[1..10] of integer 表示,其结果用数组 C,D:
array[1..30] of integer 表示。
错位相加的过程可以从开始不重叠,然后逐步重叠,再到最后的不重叠。
12
24
6
11
4
8
12
1
6
111

梯形面积的计算公式为:(上底+下底)×高÷2
其中由于约定高为 1,故可写为(上底+下底)÷2。
【程序】 n = 10;
…… function sea:real; {计算数组 c 面积}
begin
j1:=1;
while _______①______ do j1:=j1+1; endwhile;
if j1=3*n then sea:=0
else begin
j2:=3*n;
while _______②______ do
j2:=j2-1;
if j1=j2 then sea:=0
else begin
j3:=c[j1]+c[j2];
for j4:=j1+1 to j2-1 do
inc(j3,c[j4]*2);
endfor;
sea := j3 / 2
end
endif;
end;
//主程序//
for i:=1 to n do read(a[i]); endfor;
for j:=1 to n do read(b[j]); endfor;
__________③____________;
for i:=1 to 2*n+1 do
for j:=1 to 3*n do ________④__________ endfor;
for j:=1 to n do c[j+n]:=a[j] endfor;
for j:=1 to n do _________⑤__________; endfor;
p:=sea;
if p>s then begin d:=c; s:=p end; endif;
endfor;
for i:=1 to 3*n do write(d[i],' '); endfor;
write(s);
end. //主程序结束//
5.【问题描述】设有 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。
【程序要求】当给出 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 1 do
for j:= 2 to n do
if a[i]>a[j] then 3 ;
writeln('s=',s)
end.
6.【问题描述】装球:设有 n 个盒子(n 足够大,可装入任何数量的球),分别编号
1,2,……。同时有 k 个小球(k>0),今将 k 个小球装入到盒子中去。
装入规则如下:
(1) 第一个盒子不能为空。
(2) 装入必须严格按递增顺序进行。
例如,当 k=8,n=6 时,装入方法有 1,2,5 或 1,3,4
(3) 在满足上面的两个条件下,要求有球的盒子尽可能多。
(4) 装完后,相邻盒子中球个数差的绝对值之和最小(未装的盒子不计)。
如上例中:
装入法 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);
1 ;
j:=1;
while 2 do begin a[j]:=j; 3 ; j:=j+1 end;
l:=j-1;
剩余21页未读,继续阅读

















安全验证
文档复制为VIP权益,开通VIP直接复制

评论1