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

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

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

Спасибо

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


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

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

например. - Количество завершающих нулей в 126!= 31

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

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

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

25 + 5 + 1 = 31

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

Ответы

Ответ 1

Упрощенный этот вопрос, не уверен, действительно ли я прав, но здесь дедуктивное предположение:

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

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

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

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

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

Ответ 2

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

Ответ 3

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

Факторы 10 будут составлять 1,2,5,10. Таким образом, вы можете пройти через каждое из чисел N! и записать их в терминах 2 ^ х * 5 ^ у * 10 ^ г. Отбросьте другие коэффициенты чисел.

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

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

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

Ответ 4

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

#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, этот код действительно может хорошо работать!!

Ответ 10

    //SIMPLE FUNCTION TO COMPUTE THE FACTORIAL OF A NUMBER
    //THIS ONLY WORKS UPTO N = 65
    //CAN YOU SUGGEST HOW WE CAN IMPROVE IT TO COMPUTE FACTORIAL OF 400 PLEASE?     

    #include <iostream>
    #include <cmath>
    using namespace std;


    int factorial(int x);       //function to compute factorial described below

    int main()
        {
        int N; //= 150; //you can also get this as user input using cin.
        cout<<"Enter intenger\n";
        cin>>N;

        factorial(N);

        return 0;

        }//end of main




    int factorial(int x)        //function to compute the factorial
    {
     int i, n;
        long long unsigned results = 1;
        for (i = 1; i<=x; i++)
        {

        results = results * i;


        }

        cout<<"Factorial of "<<x<<" is "<<results<<endl;


        return results;
    }