完善程序题集.docx
- 文档编号:7377287
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:27
- 大小:45.36KB
完善程序题集.docx
《完善程序题集.docx》由会员分享,可在线阅读,更多相关《完善程序题集.docx(27页珍藏版)》请在冰豆网上搜索。
完善程序题集
第1题
[问题描述]
求出所有满足列条件的二位数:
将此二位数的个位数字与十位数字进行交换,可得到一个新的数,要求新数与原数之和小于100。
程序要求:
每行输出6个满足要求的数。
[算法说明]
分解每一个二位数,然后重新组成一个新数,当满足条件时,用计数器来统计个数。
[程序清单]
begin
k:
=0;
fori:
=_____①____to99do
begin
x:
=____②____;y:
=____③____;
j:
=x*10+y;
if____④____then
begin
k:
=k+1;
write(1:
4);
____⑤____thenwriteln;
end
end
end.
第2题
[问题描述]
找出小于33的6个正整数,用这些整数进行加法运算,使得包括原来的整数在内能组成尽可能多的不同整数。
例如:
用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
a[1]:
=1;t:
=0;
fori:
=2to6do
begin
____①____;
forj:
=1toi-1do
s:
=____②____;
a[i]:
=____③____;
end;
fori:
=1tO6dO
begin
t:
=____④____;
write(a[i],'')
end;
writeln('能组成不同整数的个数:
',t)
end.
第3题
[问题描述]
求出2—1000之间长度最长的、成等差数列的素数(质数)。
例如:
在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;
fori:
=2tonumdob[i]:
=i;
fori:
=2to____①____do
if____②____then
begin
k:
=i+i;
whilek<=numdo
begin
b[k]:
=0;
k:
=k+i
end
end;
fori:
=2tonum-1do
if____③____then
begin
j:
=1;
d[j]:
=b[i];
fori1:
=____④____do
ifb[i1]<>0then
begin
delta:
=____⑤____;
k:
=delta;
while(i+k<=num)and____⑥____do
begin
j:
=j+1;
d[j]:
=i+k;
k:
=k+delta
end;
ifj>maxthenbegin
max:
=j;
c:
=d{数组d的值赋给数组c}
end;
j:
=1
end
end;
writeln('Themaxlengthis:
',max);
write('Thestringis:
');
fori:
=1tomaxdowrite(c[i],'');
writeln
end.
第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,44,12)b=(23,46,4,0,18)
对a、b进行错位相加,可能有下列情况
3426154412
+)23464018
342615441223464018
或:
3426154412
+)23464018
3426154435464018
或:
3426154412
+)23464018
34261567584018
或……最后有:
3426154412
+)23464018
234640183426154412
可以看到:
由于错位不同,相加的结果也不同。
程序要求:
找出一个错位相加的方案,使得输出的数组面积为最大。
[算法说明]
设a,b的长度为10,用a,b:
array[1..10]ofinteger表示,其结果用数组c,d:
array[1..30]ofinteger表示。
错位相加的过程可以从开始不重叠,然后逐步重叠,再到最后的不重叠。
梯形面积的计算公式为:
(上底+下底)*高/2,其中约定高为1,故可写为(上底十下底)/2。
[程序清单]
constn=10;
functionsea:
=real;{计算数组C面积}
begin
j1:
=1;
while____①____doj1:
=j1+1;
ifj1=3*nthensea:
=0
elsebegin
j2:
=3*n;
while___②___doj2:
=j2-1;
ifj1=j2thensea:
=0
elsebegin
j3:
=c[jl]+c[j2];
forj4:
=jl+ltoj2-1do
j3:
=j3+c[j4]*2;
sea:
=j3/2
end
end
end;
begin{主程序}
fori:
=1tondoread(a[i]);
forj:
=1tondoread(b[j]);
___③___;
fori:
=1to2*n+1do
begin
forj:
=1to3*ndo___④___;
forj:
=1tondoc[j+n]:
=a[j];
forj:
:
1tondo___⑤___;
p:
=sea;
ifp>sthenbegin
d:
=c;
s:
=p
end;
end;
fori:
=1to3*ndowrite(d[i],'');
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=(2,3)
H=(4,0,5,3)
程序要求:
当全部表给出之后,求出表中所有元素的最大元素,以及表中所有元素之和。
【算法说明】
表用记录类型定义:
设lmax为表中元素最大个数
tabtype:
record
length:
0..lmax;{长度}
element:
array[1..lmax]Ofchar;{表体}
end;
再定义队列:
qtype=record
base:
array[0..lmax]Ofchar;
front,rear:
0..lmax;
end;
为此,设计一个字符入队的过程inqueue,出队函数outqueue,表中最大元素及元素求和均采用递归计算。
[程序清单]
constlmax=38;
vart:
array['A'..'Z']oftabtype;
s:
string[lmax];
procedureinqueue(varq:
qtype;c:
char);
begin
q.rear:
=___
(1)___;
q.base[q.rear]:
=c
end;
functionoutqueue(varq:
qtype):
char;
begin
q.front:
=___
(2)___;
outqueue:
=q.base[q.front]
end.
functionmaxnumber(c:
char):
char;
varmax:
char;
begin
max:
=chr(0);
fori:
=1tot[c].lengthdo
begin
ch:
=t[c].element[i];
if___(3)___thenm:
=maxnumber(ch)
elsem:
=ch
ifmax =m end; ___(4)___ end; functiontotal(c: char): integer vark,i: integer; begin k: =0; fori: =1tot[c].lengthdo begin ch: =t[e].lelment[i]; if___(5)___thenm: =total(ch); elsem: =ord(ch)-ord('0'); k: =k+m end; total: =k end; begin max: =36; fortabno: ='A'to'Z'dot[tabno].length: =0; q.front: =O;q.rear: =0; inqueue(q,'L'); whileq.front<>.reardo begin tabno: =outqueue(q); write(tabno,'='); readln(s); i: =1; whiles[i]<>'('doi: =i+1; whiles[i]<>')'do begin if(s[i]>='a')and(s[i]<='z') thens[i]: =chr(ord(s[i])+ord('A')-ord('a')); if(s[i]>='A')and(s[i]<='Z') thenbegin inc(t[tabno].length); t[tabno].element[t[tabno].length]: =s[i]; inqueue(q,s[i]) end elseif(s[i]>='0')and(s[i]<='9') thenbegin inc(t[tabno].length); t[tabno].element[t[tabno].length]: =s[i] end; inc(i) end; end; writeln('themaxnumberintableLis: ',maxnumber('L')); writeln('Totalis: ',total('L')) end. 第6题 [问题描述] 设有一个实数,以字符串形式存放于数组x中,用x: array[1..n]ofchar表示。 其中x[1]若为'-',表示负数;若为'+','.','',则表示正数。 若为数字,也认为是正数。 例如x=('','2',,'0','','3','.','5','%')则表示203.5 x=('-','1',,'.','','2','0','%')则表示-1.2 约定: 在字符串x中,除x[1]外,其后可以包含有若干个'.'与'',但仅以第一次出现的为准,空格不起任何作用,并以字符'%',作为结束标志。 程序要求: 将输入的字符串还原成实数(小数点后无用的0应除去),还原的结果以下列形式存放(不需要输出) f: 数符。 正数放0,负数放1。 a: array[1..n]ofinteger;存放数字,不放小数点。 k: 表示A中有效数字的个数。 j: 表示小数点后的位数。 例如: 数203.24,还原后结果的存放是: f=0 a=(2,0,3,2,4) k=5 j=2 又如: 数-33.0740,还原后结果的存放是: f=1 a=(3,3,0,7,4) k=5 j=3 [算法说明] x: array[1..10]ofchar;可放长度定为10;首先读入字符串,然后处理数的符号,在还原的过程中,需要判定正数部分与小数部分,同时去除多余的空格和小数点,并约定输入是正确的, 不用作出错检查。 [程序清单] begin’ fori: =1to10doa[i]: =0; fori: =1to10doread(x[i]); j: =0;f: =0;k: =0;b: =0; ifx[1]='-'thenbegin ___ (1)___ ___ (2)___ end elseifx[1]: =''thenI: =2 elseI: =1; while___(3)___doi: =i+1; while___(4)___do begin if(x[i]>='0')and(x[i]<='9') thenbegin k: =k+l; ___(5)___; ifb=1then___(6)___ end elseif(x[I]='.')and(b=0)thenb: =1; i: =i+l end; ifj>0thenwhilea[k]=0dobegin ___(7)___ ___(8)___ end end. 第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: anay[1..n]ofinteger和逆数计数器s,然后用一个二重循环求出数列的逆数。 [程序清单] constn=10; vari,j,s: integer; a: array[1..n]ofinteger; begin s: =0; fori: =1tondoread(a[i]); fori: =1to___ (1)___do forj: =___ (2)___tondo ifa[i]>a[j]then___(3)___ writeln('s: ',s) end. 第2题 [问题描述] 装球: 设有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: anay[1..n]ofinteger;用数组元素代表盒子,然后依次装入小球。 [程序清单] constn=20; vari,j,k,l: integer; a: array[1..n]ofinteger; begin readln(k); ___ (1)___; j: =1; while___ (2)___dobegin a[j]: =j;___(3)___;j: =j+1 end; l: =j-1; whilek>0dobegin ___(4)___; k: =k-1; l: =l-1; end; forI: =1to___(5)___do write(a[I]: 4) end. 第3题 [问题描述] 积木游戏: 设有n个小木块排成一排,如下图: 口口口…… 游戏开始时,每个小木块向下的一面涂有红、黄、蓝三种颜色之中的一种(约定: 0表示红色,1表示黄色,2表示蓝色)。 要求通过翻看与交换方式对小木块重新排列(翻看的规则为每 个小木块只能看一次),最终成为下面的形状: 口口口……口口口口……口口口口…… 红蓝黄 即相同颜色的木块排列在一起,设计一个翻看与交换的方案,使得用最少的交换次数实现上面的要求。 [算法说明] 翻看小木块时,可以从两端进行。 例如,设中间状态如下: 口口口……口回口口……回口口口……回口口口…… 红a未翻过b蓝c黄 此时,可以从两个方向看,即从a或b处开始: 1.若看a则有三种可能性: 为红色,则不用交换 为蓝色,交换一次,即a与b交换 为黄色,交换两次,即c与b交换一次,然后a与c再交换一次 此时,平均交换次数为1。 2.若看b,也有三种可能性: 为蓝色,则不用交换 为红色,交换一次,即b与a交换。 为黄色,交换一次,即b与c交换。 此时,平均交换次数为2/3。 由此可见,从b处翻看直到游戏结束,次数最少符合题目要求。 [程序清单] constn=20; vari,tem,r,b,y: integer; a: array[1..n]ofO..2; begin fori: =1tondoread(a[i]); r: =1;___ (1)___;y: =n; while___ (2)___do if___(3)___thenbegin tem: =a[r];a[r]: =a[b];a[b]: =tem; r: =r+1 end elseif___(4)___thenbegin tem: =a[b];a[b]: =a[y];a[y]: =tem; ___(5)___;___(6)___; end elseb: =b-1; fori: =1tondowrite(a[i]: 3) end. 第4题 [问题描述] 四色问题。 设有下列形状的图形: 有8个区域,其编号为1,2,…,n。 (n=8) 图形中各区域的相邻关系用上边的邻接矩阵表示: 1——相邻,0——不相邻。 问题要求: 将上面图形的每一个部分涂上红 (1),黄 (2),蓝(3),绿(4)四种颜色之一,要求相邻的部分不同色。 [算法说明] 用数组r: array[1..n,1..n]of0..1;表示邻接矩阵 s: array[1..n]ofInteger;表示涂的颜色。 采用回溯的方法,首先给第一个图形涂上红色 (1),然后在下面的图形中依次涂上其他颜色,当有矛盾时回溯解决。 [程序清单] constn=8; varI,j,k: integer; r: array[1..n,1..n]of0..1; s: array[1..n]ofinteger; begin fori: =1tondo begin forj: =1tondoread(r[i,j]);readln end; ___ (1)___;i: =2;j: =1; whilei<=ndo begin while(j<=4)and(i<=n)do begin k: =1; while___ (2)___dok: =k+1; ifk ___(4)___ i: =i+1;j: =1 end end; ifj>4thenbegini: =i-1;___(5)___end; end; fori: =1tondowriteln(i,'---',s[i]) end. 第5题 [问题描述] 多项式加法运算: 一个仅含有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) [算法说明] 多项式可用数组p: array[1..n,1..2]ofinteger表示。 分别以P1表示p,p2表示q,p3表示结果。 处理的过程为将p赋值到p3,然后逐项检查q,当发现有相同的方次时,进行系数相加;当发现没有相同的方次时,插入到p3中去。 [程序清单] varx,y,i,i1,j,j1,j2: integer; p1,p2,p3: array[1..20,1..2]ofinteger; begin i1: =0; write('InputP(x)='); read(x,y); whilex<>0dobegin j1: =j1+1;p1[j1,1]: =x;p1[j1,2]: =y; read(x,y) end; j1: =j1+1;p1[j1,1]: =O;p1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完善 程序