Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разложение натур. числа на слагаемые 
V
    Опции темы
nighthare
Дата 21.2.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Есть такая задачка: Дано натуральное число. Надо составить все его разбиения ( пример : 4=3+1 или 3=1+1+1) в антилексикографическом порядке (в обратном порядке - 4=4, 4=3+1 потом 4=2+2 , 4=2+1+1 , 4=1+2+1 , 4=1+1+2 и т.д. без нулей, т.е. все числа натуральные)

Мне кажется что это должно не сложно решаться с "рекурсивной процедурой", но вот что-то не могу сообразить...
Код

procedure antilex(n:integer);
var
 i:integer;
begin
 for i:=n downto 1 do
  begin
   {здесь я вошел в тупик  :(  }
   write(i);
   antilex(i-1);
  end;
end;

PM MAIL   Вверх
Akina
Дата 22.2.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 17
Всего: 454



Собсно список получается последовательным перемещением единицы из головы в хвост.

Критерий частичного возврата - достижение нулевого элемента (который надо виртуально добавлять в список).

По сути - обратная задача о рюкзаке.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
MBo
Дата 22.2.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 7
Всего: 18



Код

procedure TForm3.Button2Click(Sender: TObject);
  procedure DoItDoItAgain(N: Integer; s: string);
  var
    i: Integer;
  begin
    if N = 0 then
      Memo1.Lines.Add(s)
    else begin
      for i := N downto 1 do
        DoItDoItAgain(N - i, s + IntToStr(i) + ' ');
    end;
  end;
begin
  DoItDoItAgain(5, '');
end;


PM MAIL   Вверх
nighthare
Дата 22.2.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 24.12.2005

Репутация: нет
Всего: нет



Akina,
MBo, спасибо большое за помошь!
PM MAIL   Вверх
Fixin
Дата 22.2.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 5
Всего: 18



MBo, а твой вариант сделает так 4 = 2 + 2? Алгоритм толком не смотрел, потому спрашиваю.
PM MAIL ICQ   Вверх
MBo
Дата 22.2.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 7
Всего: 18



Fixin
Да, вот вывод для n=4

4
3 1
2 2
2 1 1
1 3
1 2 1
1 1 2
1 1 1 1

PM MAIL   Вверх
SoWa
Дата 22.2.2006, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 3
Всего: 74



Берешь сначала число разлагаешь на единицы, потом берешь првую единичу и прибавляешь ко всем последовательно, потом берешь двойку ит.д.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.