Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2008, 19:43   #1
terminadoor
Пользователь
 
Регистрация: 26.06.2008
Сообщений: 86
По умолчанию Расклад на сумму сложителей

Помогите плиз. Нужна прога на паскаль. Суть такая: есть число К. Сколько есть способов расклада числа К на суму слагаемых. Для числа 5 их будет 7(прога виводит 7 при входном значении 5):
1)1+1+1+1+1
2)2+1+1+1
3)2+2+1
4)3+1+1
5)3+2
6)4+1
7)5
Замечу, что 2+3 и 3+2 ето один и тот же способ.
для входних даних 7 надо вивести 15. Ведь есть 15 способов:
1) 1+1+1+1+1+1+1
2) 2+1+1+1+1+1
3) 2+2+1+1+1
4) 2+2+2+1
5) 3+1+1+1+1
6) 3+2+1+1
7) 3+2+2
8) 3+3+1
9) 4+1+1+1
10) 4+2+1
11) 4+3
12) 5+1+1
13) 5+2
14) 6+1
15) 7
Если можна помогите сделать программу. надо срочно. Спосибо заранее
TerMinAdoOR

Последний раз редактировалось terminadoor; 18.09.2008 в 20:14.
terminadoor вне форума Ответить с цитированием
Старый 18.09.2008, 22:09   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Код:
procedure ViewSumms(N:integer);
var List : array [byte] of byte;
    CountVariants : integer;

 procedure _ViewSumms(k, Count, max:integer);
 var S:String;
     i:integer;
 begin
    // Текущее разложение
    for i := 0 to Count - 1 do begin
       Write(List[i]:3);
       if i < Count -1 then Write('+') else WriteLn;
    end;
    inc(CountVariants);

    while (List[k] < max) and (k < (Count-1)) do begin
       dec(Count); inc(List[k]);   // Сумма не изменяется
       _ViewSumms(k+1, Count, List[k]);
    end;

    // Возвращаем назад
    // Полный вариант :
    //While List[k] > 1 do begin
    //   inc(Count); dec(List[k]);
    //end;
    // т.к. Count передается по значению, достаточно
    List[k] := 1;
 end;

begin
   if (N < 1) or (N > 255) then exit;
   FillChar(List, sizeOf(List), 1);
   CountVariants := 0;
   _ViewSumms(0, N, N);
   WriteLn('Всего вариантов: ', CountVariants);
end;

var N:integer;
begin
   N := 7;     // Число, которое нужно разложить на слагаемые
   ViewSumms(N);
   ReadLn;
end.
alexBlack вне форума Ответить с цитированием
Старый 19.09.2008, 08:43   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Поскольку приведенный выше вариант очень красиво выводит все разложения на экран, но очень медленно считает для N порядка 50 и выше (везде integer заменить на longint) даже если исключить вывод разложений на экран, предложу еще один вариант, который не выводит разложения на экран, зато очень быстро считает для N до 121, больше не позволяет тип Longint. Кроме того, при небольших N можно вывести на экран матрицу, где хранятся промежуточные результаты. По ней можно легко разобраться с логикой используемой рекуррентной формулы.
В коде вместо N написано K, как у автора темы.
Код:
uses crt;
var K,i,j,x,p:longint;
    s:longint;
T:array[1..121,1..121]of longint;
begin                            
clrscr;
write('K=');readln(K);
for i:=1 to K do
T[i, i] := 1;  
for i:=1 to K do
for j:=i+1 to K do
T[i,j]:=0;      
for x:=1 to K do   
for p:=1 to x-1 do
   begin
      s:=0;
      for i:=p downto 1 do
      s:=s+T[x-p,i];
      T[x,p]:=s;
   end;
s:=0;
for p:=1 to K do
s:=s+T[K,p];   
writeln('Kolichestvo razlozenij=',S);
{for i:=1 to k do   {при желании выводим матрицу}
 begin
  for j:=1 to k do
  write(T[i,j]:4);
  writeln;
 end;}
readln
end.

Последний раз редактировалось puporev; 19.09.2008 в 08:50.
puporev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
показать кол-во и сумму приходов Romuald Microsoft Office Excel 10 02.09.2008 14:17
Разложить на сумму наминалов Иллидан Паскаль, Turbo Pascal, PascalABC.NET 1 17.05.2008 15:37
впочему не выводит сумму???? макс07 Общие вопросы C/C++ 2 15.05.2008 20:25
Подсчитать сумму! Deman4eg Microsoft Office Excel 2 02.04.2008 09:16
Задача на сумму к оплате. caterva Паскаль, Turbo Pascal, PascalABC.NET 8 12.06.2007 14:12