自然数拆分算法,pascal高手请进

来源:百度知道 编辑:UC知道 时间:2024/05/16 03:57:30
2. 自然数拆分:
任何一个大于1的自然数N,总可以折分成若干个自然数之和,且拆分的方法有多种,如N=5 不同的拆分方法有以下7种:
5=1+1+1+1+1
5=1+1+1+2
5=1+2+2
5=1+1+3
5=1+4
5=2+3
5=5
5=1+4和5=4+1 是同一种拆分,只选一种.
问题要求任何给定的自然数N(N>1),求所有的拆分方法.
[程序清单]
program ex4;
const m=100;
var
s:array[1..m] of 0..m;
n,I,j,sum,count: integer;
procedure print ;
var
k :integer;
begin
count:=count+1;
write(count,’:’,n,’=’,s[1]);
for k:=2 to I do write(‘+’,s[k]);
writeln;
end;

begin
write(‘Input n:’);readln(n);
____(1)______;sum:=0;j:=0;count:=0;
write(‘output data:’);
repeat
j:=j+1;
______(2)_________
if ___(3)__then begin
s[I]:=j;
if sum =n then begin
print;
sum:=sum-s[I];
i:=I-1;
_______(4)]____;
j:=s[I]
end
else begin

完整程序如下,上机调试通过,保证运行正确,每个空的位置在程序中用{(1)}~{(5)}标明,相应位置的语句就是你的答案:
{$apptype console}
program ex4;
const m=100;
var
s:array[1..m] of 0..m;
n,I,j,sum,count: integer;
procedure print ;
var
k :integer;
begin
count:=count+1;
write(count,':',n,'=',s[1]);
for k:=2 to I do write('+',s[k]);
writeln;
end;

begin
write('Input n:');readln(n);
i:=1;{(1)}sum:=0;j:=0;count:=0;
writeln('output data:');
repeat
j:=j+1;
sum:=sum+j; {(2)}
if sum<=n{(3)} then begin
s[I]:=j;
if sum =n then begin
print;
sum:=sum-s[I];
i:=I-1;
sum:=sum-s[i]; {(4)}
j:=s[I]
end
else begin
i:=I+1;
j:=j-1; {(5)}
end
end
else begin
sum:=sum-j;
i:=I-1;
sum:=sum-s[I];