我需要一种算法来打印所有可能的数字(分区)总和。 例如:对于5我想要打印:
1+1+1+1+1
1+1+1+2
1+1+3
1+2+2
1+4
2+3
5
我在Pascal中编写代码。到目前为止,我有这个:
Program Partition;
Var
pole :Array [0..100] of integer;
n :integer;
{functions and procedures}
function Minimum(a, b :integer): integer;
Begin
if (a > b) then Minimum := b
else Minimum := a;
End;
procedure Rozloz(cislo, i :integer);
Var
j, soucet :integer;
Begin
soucet := 0;
if (cislo = 0) then
begin
for j := i - 1 downto 1 do
begin
soucet := soucet + pole[j];
if (soucet <> n) then
Write(pole[j], '+')
else Write(pole[j]);
end;
soucet := 0;
Writeln()
end
else
begin
for j := 1 to Minimum(cislo, pole[i - 1]) do
begin
pole[i] := j;
Rozloz(cislo - j, i + 1);
end;
end;
End;
{functions and procedures}
{Main program}
Begin
Read(n);
pole[0] := 101;
Rozloz(n, 1);
Readln;
End.
它运作良好但不是输出我希望得到这个:
1+1+1+1+1
2+1+1+1
2+2+1
3+1+1
3+2
4+1
5
我无法弄清楚如何以正确的方式打印它。谢谢你的帮助
编辑:将for j:=i-1 downto 1
更改为for j:=1 to i-1
解决了一个问题。但我的输出仍然是:(1 + 1 + 1 + 1 + 1)(2 + 1 + 1 + 1)(2 + 2 + 1)(3 + 1 + 1)(3 + 2)(4 + 1) )(5)但它应该是:(1 + 1 + 1 + 1 + 1)(1 + 1 + 1 + 2)(1 + 1 + 3)(1 + 2 + 2)(1 + 4)(2) +3)(5)主要问题是第5和第6个元素。它们应该是相反的顺序。
答案 0 :(得分:0)
我不会尝试Pascal,但这里是伪代码,用于按照您想要的顺序打印内容的解决方案。
procedure print_partition(partition);
print "("
print partition.join("+")
print ") "
procedure finish_and_print_all_partitions(partition, i, n):
for j in (i..(n/2)):
partition.append(j)
finish_and_print_all_partitions(partition, j, n-j)
partition.pop()
partition.append(n)
print_partition(partition)
partition.pop()
procedure print_all_partitions(n):
finish_and_print_all_partitions([], 1, n)