Во входном файле задано целое числа N(1<=N<=120). Выведите в выходной файл число способов представить N в виде суммы целых положительных чисел без учета порядка - Pascal(Паскаль)

1. 1 1 1 1//исходный массив
2. 1 1 2
3. 1 3
4. 2 2
5. 4
uses crt;
const nmax=120;
procedure Summ(N:integer);
var List : array [0..nmax] of byte;{вспомогательный массив для хранения значений слагаемых}
    CountVariants : longint;{количество вариантов}
 {вспомогательная рекурсивная процедура генерации разложений}
 procedure Generate(k, Count, max:longint);{номер элемента, количество,максимальное значение=числу}
  begin
    {Текущее разложение}
    inc(CountVariants);{первое разложение на единицы}
    while (List[k] < max) and (k < (Count-1)) do{пока значение элемента меньше числа и его номер меньше количества элементов-1}
      begin
        dec(Count); inc(List[k]);   {уменьшаем размер, переходим в следующий разряд влево, сумма не изменяется}
        Generate(k+1, Count, List[k]);{генерируем следующее разложение}
      end;
    List[k] := 1;{снова в правую крайнюю ячейку}
 end;
 
begin
   if (N < 1) or (N > nmax) then exit;{больше 120 количество разбиений выходит за пределы типа}
   FillChar(List, sizeOf(List), 1);{заполняем массив единицами}
   CountVariants := 0;
   Generate(0, N, N);{генерируем разбиения}
   WriteLn('Всего вариантов: ', CountVariants);
end;
 
var N:integer;
begin
   clrscr;
   write('N=');readln(N);{Число, которое нужно разложить на слагаемые}
   Summ(N);
   ReadLn;
end.

Leave a Comment

61 − = 54