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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2008, 20:39   #1
Дамир
Пользователь Подтвердите свой е-майл
 
Регистрация: 06.12.2006
Сообщений: 61
Вопрос Различные представление числа N в виде сумм

Доброго времени суток!
Подскажите пожалуйста, как можно решить следующую задачу:
Реализовать рекурсивный алгоритм, распечатывающий различные представления заданного натурального числа N в виде суммы не менее двух натуральных слагаемых.
Представления, различающиеся лишь порядком слагаемых, различными не считаются.
Заранее благодарен!
Дамир вне форума Ответить с цитированием
Старый 07.12.2008, 02:40   #2
TIN
Пользователь
 
Регистрация: 04.12.2008
Сообщений: 18
По умолчанию

Есть одна идейка
Количество слагаемых, на которые будем разбивать, не больше N, поэтому определим его как rand()%(N+1) (+ условие не менее двух).
Сначала берем число и разбиваем на два слагаемых:
первое = rand%N
второе = N - первое
Далее рекурсивно большее из всех слагаемое разбивается (если нужно) на сумму двух.
Какие лучше подобрать данные для хранения и сравнения представлений пока не знаю.
TIN вне форума Ответить с цитированием
Старый 07.12.2008, 19:57   #3
Дамир
Пользователь Подтвердите свой е-майл
 
Регистрация: 06.12.2006
Сообщений: 61
По умолчанию

Благодарю! Еще предложения будут?
Заранее благодарен!
Дамир вне форума Ответить с цитированием
Старый 07.12.2008, 21:27   #4
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

предлагаю свё решение:
Код:
var N:integer;
    a:array[0..1000] of integer;

function Min(m1,m2:integer):integer;
begin
 if(m1>m2) then Min:=m2
 else Min:=m1;
end;

procedure output(count:integer);
var i:integer;
begin
 write(a[1]);
 for i:=2 to count do
  write('+',a[i]);
 writeln;
end;

procedure p(k,summ:integer);
var i:integer;
begin
 if(summ=N) and (k>2) then output(k-1);
 if summ<N then
 begin
  for i:=1 to Min(N-summ,a[k-1]) do
   begin
    a[k]:=i;
    p(k+1,summ+i);
   end;
 end;
end;

begin
 a[0]:=MaxInt;
 readln(N);
 p(1,0);
 readln;
end.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 07.12.2008, 21:57   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

http://programmersforum.ru/showthread.php?t=31670
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си наити факториал большого числа и вывести в виде массива Владимир #include Помощь студентам 2 28.10.2008 13:13
Дабавление формулы СУММ через макрос Neo007 Microsoft Office Excel 6 23.10.2008 14:37
Как убрать экспонециальное представление числа alf19 Microsoft Office Excel 2 22.07.2008 16:45
Просмотр представление числа в памьяти IgorKr Общие вопросы Delphi 1 21.11.2007 08:47