1、完善程序题集第1题问题描述 求出所有满足列条件的二位数:将此二位数的个位数字与十位数字进行交换,可得到一个新的数,要求新数与原数之和小于100。 程序要求:每行输出6个满足要求的数。算法说明 分解每一个二位数,然后重新组成一个新数,当满足条件时,用计数器来统计个数。程序清单 begin k:=0; for i:=_ to 99 do begin x:=_; y:=_; j:=x*10+y; if _ then begin k:=k+1; write(1:4); _ then writeln; end end end 第2题问题描述 找出小于33的6个正整数,用这些整数进行加法运算,使得包括原来
2、的整数在内能组成尽可能多的不同整数。 例如:用2,3,5这3个数能组成下面的数 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个数。程序清单 begin a1:=1;t:=0; for i:=2 to 6 do begin _; for j:=1 to i-1 do s:=_; ai:=_; end; for i:=1 tO 6 dO begin t:=_; write(ai,) en
3、d; writeln(能组成不同整数的个数:,t) end 第3题问题描述 求出21000之间长度最长的、成等差数列的素数(质数)。 例如:在2-50之间的全部素数有 2,3,5,7,11,13,17,19,23,29,3l,37,4l,43,47 其中公差为1的素数数列为2,3,其长度为2 公差为2的素数数列为3,5,7,其长度为3 程序要求:输出满足条件的素数数列。算法说明 首先用筛选法求出此范围内的全部素数,存放在数组b中,然后用2个变量i,j, 逐步求出满足条件的素数数列。程序清单begin max:=0;num:=1000; for i:=2 to num do bi:=i; for
4、 i:=2 to _ do if _ then begin k:=i+i; while k = num do begin bk:=0; k:=k+i end end; for i:=2 to num-1 do if _ then begin j:=1; dj:=bi; for i1:=_ do if bi10 then begin delta:=_; k:=delta; while (i+k max then begin max:=j; c:=d 数组d的值赋给数组c end; j:=1 end end; writeln(The max length is:,max); write(The s
5、tring is:); for i:=1 to max do write(ci,); writelnend 第4题参考图第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
6、,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 可以看到:由于错位不同,相加的结果
7、也不同。 程序要求:找出一个错位相加的方案,使得输出的数组面积为最大。算法说明 设a,b的长度为10,用a,b:array1.10 of integer表示,其结果用数组c,d:array1. 30 of integer表示。 错位相加的过程可以从开始不重叠,然后逐步重叠,再到最后的不重叠。 梯形面积的计算公式为:(上底+下底)*高/2,其中约定高为1,故可写为(上底十下底)2。程序清单 const n=10; function sea:=real;计算数组C面积 begin j1:=1; while _ do j1: = j1 + 1; if j1 =3*n then sea: =0 els
8、e begin j2:=3 *n; while _ do j2: = j2 - 1; if j1 =j2 then sea: =0 else begin j3: =cjl +cj2; for j4:=jl+l to j2-1 do j3:=j3 +cj4 *2; sea: = j3/2 end end end; begin 主程序 for i: =1 to n do read(ai); for j: =1 to n do read(bj); _ ; for i: =1 to 2 * n+1 do begin for j:=1 to 3*n do _ ; for j:=1 to n do cj+
9、n:=aj; for j:1 to n do _ ; p:=sea; if p s then begin d: =c; s: =p end; end; for i: = 1 to 3 * n do write(di, ); writeln; writeln ( s=, s) end.第5题问题描述 表的操作:设有一个表,记为L=(a1,a2,an),其中: L:表名。 a1,a2,an为表中的元素。 当ai为0-9数字时,表示元素,为大写字母时表示是另一个表,但不能循环定义。 例如下列表的定义是合法的(约定L是第一个表的表名)。 L=(1,3,K,8,0,4) K=(3,P,4,H,7) P=
10、(2,3) H=(4,0,5,3)程序要求:当全部表给出之后,求出表中所有元素的最大元素,以及表中所有元素之和。【算法说明】 表用记录类型定义:设lmax为表中元素最大个数 tabtype:record length:0.lmax; 长度 element:array1.lmax Of char; 表体 end; 再定义队列: qtype=record base:array0.lmax Of char; front,rear:0.lmax; end; 为此,设计一个字符入队的过程inqueue,出队函数outqueue,表中最大元素及元素求和均采用递归计算。程序清单const lmax = 38
11、;var t: array A. Z of tabtype; s: stringlmax;procedure inqueue(var q:qtype; c : char);begin q. rear:= _(1)_ ; q. baseq.rear := cend;function outqueue(var q:qtype):char;begin q. front:= _(2)_ ; outqueue:= q.baseq.frontend.function maxnumber(c:char):char;var max: char;begin max:= chr(0); for i:= 1 to
12、tc.length do begin ch:= tc.elementi; if _(3)_ then m:= maxnumber(ch) else m:= ch if max m then max:=m end; _(4)_end;function total(c:char):integervar k, i: integer;begin k:=0; for i:= 1 to tc.length do begin ch:= te.lelmenti; if _(5)_ then m:= total(ch); else m:=ord(ch)-ord(0); k:=k+m end; total:= k
13、end;begin max:=36; for tabno:= A to Z do ttabno.length:=0; q.front:=O;q.rear:=0; inqueue(q,L); while q.front .rear do begin tabno:= outqueue(q); write(tabno,=); readln(s); i:=1; while si ( do i:=i+1; while si ) do begin if(si =a)and(si =A)and(si=0)and(si =0)and(xi 0 then while ak =0 do begin _(7)_ _
14、(8)_ endend.第1题问题描述 设有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:anay1.n of integer和逆数计数器s,然后用一个二重循环求出数列的逆数。程序清单const n = 10;var i, j, s: integer;
15、 a: array1.n of integer;begin s:=0; for i:= 1 to n do read(ai); for i:= 1 to _(1)_ do for j:= _(2)_ to n do if ai aj then _(3)_ writeln(s:,s)end.第2题问题描述 装球:设有n个盒子(n足够大,可装入任何数量的球),分别编号1,2,。同时有k个小球(k0),今将k个小球装入到盒子中去。装入规则如下: (1)第一个盒子不能为空。 (2)装入必须严格按递增顺序进行。 例如,当k:8,n;6时,装入方法有1,2,5或1,3,4。 (3)在满足上面的两个条件下,
16、要求有球的盒子尽可能多。 (4)装完后,相邻盒子中球的个数差的绝对值之和最小(未装的盒子不计)。 如上例中 装入法1,2,5,则差的绝对值之和为2-1+5-2=4 装入法1,3,4,则差的绝对值之和为3-1+4-3=3 程序要求:给出k(k表示小球的个数)之后,求出满足上述四个条件的装入方法。算法说明 设置数组a:anay1.n of integer;用数组元素代表盒子,然后依次装入小球。程序清单const n = 20;var i, j, k, l:integer; a: array1.n of integer;begin readln(k); _(1)_; j:=1; while _(2)
17、_ do begin aj:=j; _(3)_ ;j:=j+1 end; l:=j-1; while k 0 do begin _(4)_ ; k:=k-1; l:=l-1; end; for I:= 1 to _(5)_ do write(aI:4)end.第3题问题描述 积木游戏:设有n个小木块排成一排,如下图: 口口口 游戏开始时,每个小木块向下的一面涂有红、黄、蓝三种颜色之中的一种(约定:0表示红色,1表示黄色,2表示蓝色)。要求通过翻看与交换方式对小木块重新排列(翻看的规则为每个小木块只能看一次),最终成为下面的形状: 口口口口 口口口口 口口口 红 蓝 黄 即相同颜色的木块排列在一
18、起,设计一个翻看与交换的方案,使得用最少的交换次数实现上面的要求。算法说明 翻看小木块时,可以从两端进行。例如,设中间状态如下: 口口口口 回口口回 口口口回 口口口 红 a 未翻过 b 蓝 c 黄 此时,可以从两个方向看,即从a或b处开始: 1若看a则有三种可能性: 为红色,则不用交换 为蓝色,交换一次,即a与b交换 为黄色,交换两次,即c与b交换一次,然后a与c再交换一次 此时,平均交换次数为1。 2若看b,也有三种可能性: 为蓝色,则不用交换 为红色,交换一次,即b与a交换。 为黄色,交换一次,即b与c交换。 此时,平均交换次数为2/3。 由此可见,从b处翻看直到游戏结束,次数最少符合题
19、目要求。程序清单const n=20;var i, tem, r, b, y: integer; a:array1.n of O.2;begin for i:=1 to n do read(ai); r:=1; _(1)_ ; y:=n; while _(2)_ do if _(3)_ then begin tem:=ar;ar:=ab;ab:=tem; r:=r+1 end else if _(4)_ then begin tem:=ab;ab:=ay;ay:=tem; _(5)_ ; _(6)_ ; end else b:=b-1; for i:=1 to n do write(ai:3)
20、end.第4题问题描述 四色问题。设有下列形状的图形:有8个区域,其编号为1,2,n。(n=8) 图形中各区域的相邻关系用上边的邻接矩阵表示:1相邻,0不相邻。 问题要求:将上面图形的每一个部分涂上红(1),黄(2),蓝(3),绿(4)四种颜色之一,要求相邻的部分不同色。算法说明 用数组r:array1.n,1.n of 0.1;表示邻接矩阵 s:array1.n of Integer;表示涂的颜色。 采用回溯的方法,首先给第一个图形涂上红色(1),然后在下面的图形中依次涂上其他颜色,当有矛盾时回溯解决。程序清单const n=8;var I, j, k :integer; r:array1.
21、n,1.n of 0.1; s:array1.n of integer;begin for i:=1 to n do begin for j:=1 to n do read(ri,j); readln end; _(1)_ ; i:=2; j:=1; while i=n do begin while (j = 4) and (i = n) do begin k:=1; while _(2)_ do k:= k + 1; if k 4 then begin i := i - 1; _(5)_ end; end; for i:=1 to n do writeln(i,-,si)end.第5题问题描
22、述 多项式加法运算:一个仅含有x的多项式可以用下列的方式表示: (系数,指数),(系数,指数),(0,0)。其中(0,0)作为结束标志。 例如:P(x)=4x6-3x3+2x2-1可表示为:(4,6),(-3,3),(2,2),(-1,0),(0,0) Q(x)=x4-x+1 可表示为:(1,4),(-1,1),(1,0),(0,0) 当用上面的方式给出2个多项式之后,程序对这两个多项式进行加法运算,结果也用上面的方式给出。 例如:上面的P(x)和Q(x)相加的结果为:4x6+x4-3x3+2x2-x 表示结果为:(4,6),(1,4),(-3,3),(2,2),(-1,1),(0,0)算法说
23、明 多项式可用数组p:array1.n,1.2 of integer表示。 分别以P1表示p,p2表示q,p3表示结果。处理的过程为将p赋值到p3,然后逐项检查q,当发现有相同的方次时,进行系数相加;当发现没有相同的方次时,插入到p3中去。程序清单var x, y, i, i1, j, j1, j2:integer; p1, p2, p3: array 1.20, 1.2 of integer;begin i1:=0; write(Input P(x)=); read (x, y); while x 0 do begin j1:=j1+1; p1j1,1:=x;p1j1,2:=y; read(x,y) end; j1:=j1+1; p1j1,1:=O; p1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1