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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2010, 14:47   #1
p1r2o3
Пользователь
 
Регистрация: 09.12.2009
Сообщений: 20
Сообщение Разбиение числа на слагаемые

Мне недавно попалась задачка про разбиения чила на не повторяющиеся слагаемые. Уже неделю как мучаюсь.. но без толку.. кто-нибудь знает как его решать? формулу-то я знаю.. вот как его применять это неизвестно.
p1r2o3 вне форума Ответить с цитированием
Старый 17.02.2010, 15:30   #2
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

В чем конкретно задача? посчитать число разбиений? Или найти все разбиения (вывести их, к примеру)? В первом случае формулой или динамикой, во втором я чаще всего пишу циклическую генерацию лексикографически предидущего или лексикографически следующего разбиения (повторять до тех пор, пока возможно, и выводить, что получается).
Какие ограниения?.
LeBron вне форума Ответить с цитированием
Старый 17.02.2010, 18:57   #3
p1r2o3
Пользователь
 
Регистрация: 09.12.2009
Сообщений: 20
По умолчанию

выводить количество. n может быть от 5ти до 500
p1r2o3 вне форума Ответить с цитированием
Старый 17.02.2010, 23:04   #4
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Так если у Вас формула, есть, то в чем проблема?
Хотя при 500 даже оптимально написанная кубическая динамика должна проходить в пределах секунды.
LeBron вне форума Ответить с цитированием
Старый 21.02.2010, 19:01   #5
p1r2o3
Пользователь
 
Регистрация: 09.12.2009
Сообщений: 20
По умолчанию

по времени не совпадает..
а если ввести массив то по памяти не будет совпадать
p1r2o3 вне форума Ответить с цитированием
Старый 21.02.2010, 20:38   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Ну можно тупо в лоб и сразу на вывод. Памяти не требует, скорость - миллиард за 3 секунды обрабатывает
Код:
uses
  system;
var
  i, x: longint;
begin
  readln(x);
  i := 1;
  repeat
    x := x - i;
    write(i, ' ');
    inc(i)
  until x <= 2*i;
  writeln(x);
  writeln('count = ', i);
  readln
end.
P.S. Для чисел больше двух.
eoln вне форума Ответить с цитированием
Старый 21.02.2010, 21:20   #7
Serebro
FORTRAN programmer
Форумчанин
 
Регистрация: 08.12.2009
Сообщений: 153
По умолчанию

нужен ли случай 0+n?

Последний раз редактировалось Serebro; 21.02.2010 в 21:22.
Serebro вне форума Ответить с цитированием
Старый 22.02.2010, 17:24   #8
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Ну можно тупо в лоб и сразу на вывод. Памяти не требует, скорость - миллиард за 3 секунды обрабатывает
Код:
uses
  system;
var
  i, x: longint;
begin
  readln(x);
  i := 1;
  repeat
    x := x - i;
    write(i, ' ');
    inc(i)
  until x <= 2*i;
  writeln(x);
  writeln('count = ', i);
  readln
end.
P.S. Для чисел больше двух.
О_о Вы хоть тестировали это? Оно как бы не работает...
Цитата:
Сообщение от p1r2o3 Посмотреть сообщение
выводить количество. n может быть от 5ти до 500
Задачка откуда? И важен ли порядок чисел в разбиении? Если нет - детски простая динамика пишется легко и точно проходит (взгляните на задачу 1017 на Тимусе, я использовал там именно такую динамику, ограничения по времени 1 секунда, по памяти 16 мб, проходит, у меня
1017 C++ Accepted
0.078 2 813 КБ
).
Если да - надо подумать над более красивым решением, можно просунуть и такое, но его надо будет дописать и доделать в ущерб красоте и простоте.
LeBron вне форума Ответить с цитированием
Старый 22.02.2010, 23:56   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от LeBron Посмотреть сообщение
О_о Вы хоть тестировали это? Оно как бы не работает...
Я что-то не понял? Задача разбить на неповторяющиеся слагаемые. Вводим, например 19. 19=1+2+3+4+9. Всё! 9 не разбить уже, т.к 9 = 1+8 или 2+7 или 3+6 или 4+5.
В count'e количество слагаемых.
Зачем динамика? о_О
Изображения
Тип файла: jpg 0.JPG (15.6 Кб, 420 просмотров)
eoln вне форума Ответить с цитированием
Старый 23.02.2010, 00:32   #10
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Я что-то не понял? Задача разбить на неповторяющиеся слагаемые. Вводим, например 19. 19=1+2+3+4+9. Всё! 9 не разбить уже, т.к 9 = 1+8 или 2+7 или 3+6 или 4+5.
В count'e количество слагаемых.
Зачем динамика? о_О
Если речь идет именно о задаче, то
Цитата:
p1r2o3
выводить количество. n может быть от 5ти до 500
Цитата:
p1r2o3
про разбиения
Выводить количество - количество чего? Разбиений, как я понимаю.

И задача не про разбиение, а про разбиения, следовательно, от нас требуется не розбить, а найти количество всех.

Согласен, если бы "задача" была именно в выводе одного произвольного разбиения - Ваше решение верное, к нему особых претензий нету. Только тогда это назвать задачей трудновато, так как это кодинговое упражнение. И придумать "формулу" тоже трудно.
LeBron вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбиение на колонки zenner Microsoft Office Excel 13 05.10.2009 09:31
Разбиение записей Лубышев Microsoft Office Access 0 17.03.2009 08:27
Все возможные слагаемые anGeee Паскаль, Turbo Pascal, PascalABC.NET 4 04.12.2008 20:22
Разбиение на части MAcK Общие вопросы .NET 4 18.09.2008 13:56
Разложение числа на слагаемые Oleg-vp Общие вопросы Delphi 5 30.10.2007 10:43