所有数字的总和

时间:2014-12-06 17:42:31

标签: algorithm pascal freepascal

我需要一种算法来打印所有可能的数字(分区)总和。 例如:对于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个元素。它们应该是相反的顺序。

1 个答案:

答案 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)