Вычисления больших факториалов в C++

Я понимаю, что это классическая проблема программирования и поэтому я хочу быть ясно, я не ищу код в качестве решения, но был бы признателен за толчок в правильном направлении. Я изучаю C++ , и в рамках учебного процесса я пытаюсь решить некоторые проблемы программирования. Я пытаюсь написать программу, которая имеет дело с числами до факториала 1billion. Очевидно, что это будут огромные числа и слишком большие, чтобы иметь дело с использованием обычных арифметических операций. Любой указание на то, в каком направлении я должен идти, пытаясь решить этот тип проблемы, было бы оценено.

Я бы предпочел попытаться решить эту проблему без использования дополнительных библиотек, если это возможно

спасибо

PS-проблема здесь http://www.codechef.com/problems/FCTRL


вот метод, который я использовал для решения проблемы, это было достигнуто путем чтения комментариев ниже:

решение -- число 5 является простым коэффициент любого числа, заканчивающегося нулем. Поэтому, разделив факториальное число на 5, рекурсивно и добавив коэффициенты, вы получите количество конечных нулей в факториальном результате

E. G.-количество конечных нулей в 126! = 31

126/5 = 25 остаток 1

25/5 = 5 остаток 0

5/5 = 1 остаток 0

25 + 5 + 1 = 31

Это работает для любого значения, просто продолжайте делить, пока фактор не станет меньше чем 5

9 ответов


пробежал этот вопрос, не уверен, что я действительно правильно понял, но вот дедуктивная догадка:

первый вопрос-как вы получаете ноль в конце числа? Умножая на 10.

Как вы умножаете на 10? либо путем умножения на 10, либо на 2 x 5...

Итак, для X! сколько 10s и 2x5s у вас есть...?

(к счастью, 2 и 5-простые числа)

edit: вот еще один намек - Я не думаю, что вам нужно это делать любой умножение. Дай мне знать, если тебе понадобится еще один намек.


подсказка: возможно, Вам не нужно вычислять N! для того, чтобы найти количество нулей на конце N!


чтобы решить этот вопрос, Как сказал Крис Джонсон, вы должны посмотреть на число 0.

факторы 10 будет сама 1,2,5,10. Итак, вы можете пройти через каждое из чисел N! и напишите их в терминах 2^x * 5^y * 10^z. Отбросьте другие факторы чисел.

теперь ответ будет greaterof(x, y)+z.

одна интересная вещь, которую я узнаю из этого вопроса, - это всегда лучше хранить факториал числа в терминах простых факторов для удобства сравнения.

на самом деле x^y, есть простой метод, используемый в алгоритме RSA, который не помнит. Я попытаюсь обновить сообщение, если найду его.


Это не хороший ответ на ваш вопрос, поскольку вы немного изменили его от того, что я изначально читал. Но я все равно оставлю его здесь, чтобы продемонстрировать непрактичность фактических попыток сделать расчеты с помощью основной грубой силы.

один миллиард факториалов будет вне досягаемости любой библиотеки bignum. Для представления таких чисел потребуется больше места, чем почти у кого-либо в ОЗУ. Вам придется начать подкачку чисел из хранилища, когда вы работаете над их. Есть способы сделать это. The парень, который недавно подсчитал π до 2700 миллиардов мест использовал такую библиотеку


Не используйте наивный способ. Если вам нужно рассчитать факториал, используйте быстрый алгоритм:http://www.luschny.de/math/factorial/FastFactorialFunctions.htm


Я думаю, что вы должны придумать способ решить проблему в псевдо-коде, прежде чем начать думать о C++ или любом другом языке, если на то пошло. Природа вопроса, как указывали некоторые, является скорее проблемой алгоритма, чем проблемой c++. Те, кто предлагает поискать какую-нибудь малоизвестную библиотеку, указывают вам на скользкий путь, потому что обучение программированию-это обучение мышлению, верно? Найдите хороший алгоритм анализа текста и он вам послужит что ж. На нашем факультете мы преподаем с среды CLR текст.


вам понадобится "большая цифра" пакет-либо тот, который вы используете, либо тот, который вы пишете сами.

Я бы рекомендовал сделать некоторые исследования в "алгоритмы большого числа". Вы захотите реализовать c++ - эквивалент Java BigDecimal.

другой способ взглянуть на это-использовать Гамма-функция. Вам не нужно умножать все эти значения, чтобы получить правильный ответ.


для начала вы должны сохранить число в каком-то массиве, таком как std::vector (цифра для каждой позиции в массиве), и вам нужно найти определенный алгоритм, который вычислит факториал (возможно, в каком-то специализированном классе). ;)


чтобы вычислить большой факториал, вы можете использовать этот код в C++:

#include<iostream>
using namespace std;

long double factorial(int n);

int main()
{
    int n;

    cout << "Enter a positive integer: ";
    cin >> n;

    cout << "Factorial of " << n << " = " << factorial(n);

    return 0;
}

long double factorial(int n)
{
    if(n > 1)
        return n * factorial(n - 1);
    else
        return 1;
}

поскольку длинный двойной содержит большие данные 1.7E +/- 308 этот код действительно может хорошо работать !!