完善程序题集Word文件下载.docx
- 文档编号:20486997
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:27
- 大小:45.36KB
完善程序题集Word文件下载.docx
《完善程序题集Word文件下载.docx》由会员分享,可在线阅读,更多相关《完善程序题集Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
,t)
第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:
num:
=1000;
=2tonumdob[i]:
=i;
=2to____①____do
if____②____then
=i+i;
whilek<
=numdo
b[k]:
=k+i
=2tonum-1do
if____③____then
d[j]:
=b[i];
fori1:
=____④____do
ifb[i1]<
>
0then
delta:
=____⑤____;
=delta;
while(i+k<
=num)and____⑥____do
=j+1;
=i+k;
=k+delta
ifj>
maxthenbegin
=j;
c:
=d{数组d的值赋给数组c}
=1
Themaxlengthis:
,max);
write('
Thestringis:
);
=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
或:
3426154435464018
34261567584018
或……最后有:
234640183426154412
可以看到:
由于错位不同,相加的结果也不同。
找出一个错位相加的方案,使得输出的数组面积为最大。
设a,b的长度为10,用a,b:
array[1..10]ofinteger表示,其结果用数组c,d:
array[1..30]ofinteger表示。
错位相加的过程可以从开始不重叠,然后逐步重叠,再到最后的不重叠。
梯形面积的计算公式为:
(上底+下底)*高/2,其中约定高为1,故可写为(上底十下底)/2。
constn=10;
functionsea:
=real;
{计算数组C面积}
j1:
while____①____doj1:
=j1+1;
ifj1=3*nthensea:
=0
elsebegin
j2:
=3*n;
while___②___doj2:
=j2-1;
ifj1=j2thensea:
j3:
=c[jl]+c[j2];
forj4:
=jl+ltoj2-1do
=j3+c[j4]*2;
sea:
=j3/2
end;
begin{主程序}
=1tondoread(a[i]);
=1tondoread(b[j]);
___③___;
=1to2*n+1do
=1to3*ndo___④___;
=1tondoc[j+n]:
=a[j];
:
1tondo___⑤___;
p:
=sea;
ifp>
sthenbegin
d:
=c;
=p
=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;
{表体}
再定义队列:
qtype=record
base:
array[0..lmax]Ofchar;
front,rear:
为此,设计一个字符入队的过程inqueue,出队函数outqueue,表中最大元素及元素求和均采用递归计算。
constlmax=38;
vart:
array['
A'
..'
Z'
]oftabtype;
string[lmax];
procedureinqueue(varq:
qtype;
c:
char);
q.rear:
=___
(1)___;
q.base[q.rear]:
=c
end;
functionoutqueue(varq:
qtype):
char;
q.front:
=___
(2)___;
outqueue:
=q.base[q.front]
functionmaxnumber(c:
char):
varmax:
char;
=chr(0);
=1tot[c].lengthdo
ch:
=t[c].element[i];
if___(3)___thenm:
=maxnumber(ch)
elsem:
=ch
ifmax<
mthenmax:
=m
___(4)___
functiontotal(c:
integer
vark,i:
integer;
=0;
=t[e].lelment[i];
if___(5)___thenm:
=total(ch);
=ord(ch)-ord('
0'
=k+m
total:
=k
=36;
fortabno:
='
to'
dot[tabno].length:
q.front:
=O;
q.rear:
inqueue(q,'
L'
whileq.front<
.reardo
tabno:
=outqueue(q);
write(tabno,'
='
readln(s);
i:
=1;
whiles[i]<
('
doi:
=i+1;
)'
do
if(s[i]>
a'
)and(s[i]<
z'
thens[i]:
=chr(ord(s[i])+ord('
)-ord('
));
)and(s[i]<
thenbegin
inc(t[tabno].length);
t[tabno].element[t[tabno].length]:
=s[i];
inqueue(q,s[i])
elseif(s[i]>
9'
t[tabno].element[t[tabno].length]:
=s[i]
inc(i)
themaxnumberintableLis:
maxnumber('
Totalis:
total('
))
第6题
设有一个实数,以字符串形式存放于数组x中,用x:
array[1..n]ofchar表示。
其中x[1]若为'
-'
,表示负数;
若为'
+'
,'
.'
,则表示正数。
若为数字,也认为是正数。
例如x=('
2'
,,'
3'
5'
%'
)则表示203.5
x=('
1'
)则表示-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)
j=3
x:
array[1..10]ofchar;
可放长度定为10;
首先读入字符串,然后处理数的符号,在还原的过程中,需要判定正数部分与小数部分,同时去除多余的空格和小数点,并约定输入是正确的,
不用作出错检查。
begin’
=1to10doa[i]:
=1to10doread(x[i]);
f:
k:
b:
ifx[1]='
___
(1)___
___
(2)___
elseifx[1]:
thenI:
=2
elseI:
=1;
while___(3)___doi:
=i+1;
while___(4)___do
if(x[i]>
)and(x[i]<
=k+l;
___(5)___;
ifb=1then___(6)___
elseif(x[I]='
)and(b=0)thenb:
=1;
=i+l
0thenwhilea[k]=0dobegin
___(7)___
___(8)___
设有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:
a:
array[1..n]ofinteger;
=1tondoread(a[i]);
=1to___
(1)___do
=___
(2)___tondo
ifa[i]>
a[j]then___(3)___
s:
s)
装球:
设有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;
readln(k);
___
(1)___;
while___
(2)___dobegin
a[j]:
=j;
___(3)___;
j:
=j+1
l:
=j-1;
whilek>
0dobegin
___(4)___;
=k-1;
=l-1;
forI:
=1to___(5)___do
write(a[I]:
4)
积木游戏:
设有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:
array[1..n]ofO..2;
=1tondoread(a[i]);
r:
___
(1)___;
=n;
while___
(2)___do
if___(3)___thenbegin
tem:
=a[r];
a[r]:
=a[b];
a[b]:
=tem;
=r+1
elseif___(4)___thenbegin
=a[y];
a[y]:
___(6)___;
elseb:
=b-1;
=1tondowrite(a[i]:
3)
四色问题。
设有下列形状的图形:
有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:
array[1..n,1..n]of0..1;
array[1..n]ofinteger;
=1tondo
=1tondoread(r[i,j]);
readln
=2;
whilei<
=ndo
while(j<
=4)and(i<
=n)do
while___
(2)___dok:
=k+1;
ifk<
ithen___(3)___elsebegin
4thenbegini:
=i-1;
___(5)___end;
=1tondowriteln(i,'
---'
s[i])
多项式加法运算:
一个仅含有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:
p1,p2,p3:
array[1..20,1..2]ofinteger;
i1:
InputP(x)='
read(x,y);
whilex<
=j1+1;
p1[j1,1]:
=x;
p1[j1,2]:
=y;
read(x,y)
p1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完善 程序