| imho.ws |
![]() |
|
|
|
# 1 |
|
Junior Member
Регистрация: 20.06.2003
Адрес: Israel
Сообщения: 106
![]() |
Задача. Помогите кто может.
Как можно рекурсивно подсчитать кол-во возможних вариантов составить число с помощью умножения и сложения. Умножение на 1 не считается. Т.е. поясню на примере есле допустим дано число 4 то все возможные действя будут такими:
Код:
4 (1+ 3) (1+ (1+ 2)) (1+ (2 +1)) (1+ (1+ (1+1))) (1+ ((1+1) +1)) (2 + 2) (2 + (1+1)) ((1+1) + 2) ((1+1) + (1+1)) (3+1) ((1+ 2) +1) ((2 +1) +1) ((1+ (1+1)) +1) (((1+1) +1) +1) (2*2) (2*(1+1)) ((1+1)*2) ((1+1)*(1+1)) |
|
|
|
|
# 4 |
|
::VIP::
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
точного алгоритма я не знаю, но вот, что приходит на ум:
-нам известно сколькими способами можно записать число только используя операцию сложения (вроде это не сложно, просто сначала все единицы, потом вычитаем одну позицию, двойку перемецаем по всем оставшимся, затем вычитаем две позиции, тройку перемещаем по всем оставшимся, короче суть в том, что вроде количество сложений мы узнаем за "констатнту", т.е. не тратим на это времени )-а затем остается только найти все простые делители этого числа (можно обычным перебором, есть конечно и другие алгоритмы, но если число не очень большое, то перебор подойдет, причем перебирать нужно, как известно, до квадратного корня этого числа, плюс можно составить заранее таблицу простых чисел до какого-нибудь, что в разы увеличит время) и для каждого делителя (и их произведения, это в цикле) вызываем процедуру подсчитывания количества представлений с помощью сложения... В итоге получаем трудоемкость, сравнимую с нахождением простых делителей числа + само количество простых делителей (последнее можно и не считать)... Посмотри, может идею поймешь, дальше разовьешь, если что, пиши, сейчас буду думать над первым шагом этого алгоритма
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным. |
|
|
|
|
# 5 | |
|
Advanced Member
Регистрация: 21.04.2005
Адрес: град Москва
Сообщения: 431
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
1) генеряться "лишние" последовательностм ИЛИ 2) выбор порядка действий для суммы (или расстановка скобок) (1) можно преодолеть постоянной чисткой массива, но это не есть хорошо, ибо все трудозатраты уйдут именно на такую чистку (2) если составим алгоритм для этой задачи, это упрощает дело... |
|
|
|
|
|
# 6 |
|
Junior Member
Регистрация: 20.06.2003
Адрес: Israel
Сообщения: 106
![]() |
У меня была попытка сделать это с помощью комбинаторики т.е. вычисляем кол-во способов разложить на сумму потом используя это делать разложение на множители т.е. тупо проверять делиться ли число если да то на сколько слагаемых можно разложить делители и так далее в цикле, но проблема возникает ещё на уровне подсчёта слагаемых. Я пытался реализовать рекурсивный алгоритм, но что-то в нем не так, или я просто не догоняю.
Код:
unsigned long sumNum(unsigned int n)
{
int i;
unsigned long count=1;
if (n==2) return 1;
for (i=1; i<n; ++i)
count+=sumNum(n-i)+sumNum(i);
return count;
}
Буду рад любым идеям. |
|
|