大家帮忙看看我这个程序!

来源:百度知道 编辑:UC知道 时间:2024/06/25 22:39:57
var i,j,s:integer;
b:array[0..5] of integer;
begin
s:=1;
for i:=1 to 5 do b[i]:=i;
j:=1;
while j>0 do
begin
j:=5;
while (j>0)and(b[j]=10+j-5)do j:=j-1;
if j>0 then
begin
s:=s+1;
b[j]:=b[j]+1;
for i:=(j+1) to 5 do b[i]:=b[j]+i-j;
end;
end;
writeln(s);
end.

做一个变量分析:
i:
for i:=1 to 5 do b[i]:=i;
赋初值,不谈。b:12345;
for i:=(j+1) to 5 do b[i]:=b[j]+i-j;
这一句比较重要,在最重要的循环里,稍后分析;

j:
j:=1;
明显为了使j>0成立进入循环;
while j>0 do
j:=5;
每次循环j等于5;
while (j>0)and(b[j]=10+j-5)do j:=j-1;
非常重要,稍后分析;
if j>0 then
begin
b[j]:=b[j]+1;
for i:=(j+1) to 5 do b[i]:=b[j]+i-j;
b[j]自身加一,然后让b[j]之后的所有量按照升序排列,有点意思,貌似是某种排列;

s:
s:=1;
初值;
s:=s+1;
writeln(s);
作为最后的输出值,可以看出,s就是个累加器,我们的答案就是该过程的执行次数。

b[1..5]:
while (j>0)and(b[j]=10+j-5)do j:=j-1;
最好不要把10+j-5化成j+5,这样反而不好理解。由10+j-5感觉到其结果必然是一个大于5的数字,而且总是递增;
for i:=(j+1) to 5 do b[i]:=b[j]+i-j;
同上分析;

好了,看一下核心部分:
while j>0 do
begin
j:=5;
while (j>0)and(b[j]=10+j-5)do j:=j-1;
if j>0 then
begin
s:=s+1;
b[j]:=b[j]+1;
for i:=(j+1) to 5 do b[i]:=b[j]+i-j;
end;
end;
每次把j置初