![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
Krom0707 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 10.1.2008 Репутация: нет Всего: нет |
Требуется создать программу на С++: подсчет количества разбиений числа на сумму слагаемых.
Программа должна считать количество разбиений числа 100 меньше 5 секунд, не могу преодолеть этот барьер. Вот две программы, помогите кто чем может!
Это сообщение отредактировал(а) Kuvaldis - 10.1.2008, 19:19 |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
-------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
PPS05 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 262 Регистрация: 6.11.2005 Где: Беларусь, Минск Репутация: 1 Всего: 7 |
Вот, писал когда-то. Входное число в decomp.in. Предполагается, что перестановка слагаемых не дает нового способа (впрочем, нетрудно подправить, наверное...)
-------------------- Ушел с форума и не вернулся. |
|||
|
||||
Krom0707 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 10.1.2008 Репутация: нет Всего: нет |
Спасибо, только и твой алгоритм выполняется больше 5 секунд, а мне нужно быстрее!
|
|||
|
||||
crazy_hand |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 12.12.2007 Где: Санкт-Петербург Репутация: нет Всего: нет |
Krom0707,
PPS05, попробуй в этот алгоритме число константой задавать - ведь оно заранее известно, а считывание из файла - очень долгая операция. |
|||
|
||||
Krom0707 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 10.1.2008 Репутация: нет Всего: нет |
Я так и сделал, для 99 алгоритм считает 16 секунд! Надо 5!
|
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
Тебе нужно подсчитать количество разбиений или найти все разбиения? Если первое, то не нужно печатать собственно разбиения, достаточно посчитать их количество. Если второе - то сам по себе простой вывод через cout всех их займет более 5 сек. Если же нужно именно второе, то попробуй вывод в файл (можно даже перенаправить с коммандной строки) и выводить через fprintf - он быстрей. Сама по себе твой алгоритм и так достаточно оптимален, ускорить будет сложно. |
||||
|
|||||
PPS05 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 262 Регистрация: 6.11.2005 Где: Беларусь, Минск Репутация: 1 Всего: 7 |
Пренебрежительно мало. ![]() -------------------- Ушел с форума и не вернулся. |
|||
|
||||
PPS05 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 262 Регистрация: 6.11.2005 Где: Беларусь, Минск Репутация: 1 Всего: 7 |
Проверьте, пожалуйста, для 100 ответ 190569292 ?
Если да, то вот код (работает доли секунды, не комментирую, ибо не уверен в правильности):
Это сообщение отредактировал(а) PPS05 - 11.1.2008, 15:36 -------------------- Ушел с форума и не вернулся. |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: нет Всего: 223 |
Посмотрел твою вторую программу - ничего не понял ![]() Для подсчета количества разбиений (если считать все разбиения, включая перестановки слогаемых) можно применить метод динамического програмирования: Ищутся разбиения для всех чисел не больших, чем заданное (и сохраняются в массиве) Поиск количества разбиений для числа N происходит так: 1) Одно разбиение - само число целиком 2) Разбиваем число на 2 половины (N-1 способами: A и B=N-A), прибавляем произведения количества возможных разбиений для A и B
Время исполнения для 100 - 5 ms (для 999 - 50 ms) Результат для 100 - 2029745963 (хм, кто больше ![]() Это сообщение отредактировал(а) xvr - 11.1.2008, 15:54 |
||||
|
|||||
PPS05 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 262 Регистрация: 6.11.2005 Где: Беларусь, Минск Репутация: 1 Всего: 7 |
Я больше поверю, что ответ 2029745963...
![]() Я тоже делал динимическим, только лень было с порядком вычисления возиться. Функция foo(i, j) возвращает количество разбиений для числа i, если первое слагаемое j. M - для запоминания ранее высчитанных ("рекурсия с меморизацией"). -------------------- Ушел с форума и не вернулся. |
|||
|
||||
Krom0707 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 10.1.2008 Репутация: нет Всего: нет |
Спасибо ,PPS05, ваша программа работает идеально!
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |