Вычисление больших факториалов в С++
Я понимаю, что это классическая проблема программирования, и поэтому я хочу быть ясной. Я не ищу код в качестве решения, но буду благодарен за толкание в правильном направлении. Я изучаю С++ и, как часть процесса обучения, я пытаюсь решить некоторые проблемы с программированием. Я пытаюсь написать программу, которая имеет дело с числами до факториала 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 миллиардов мест, использовал такую библиотеку
Ответ 5
Не используйте наивный метод. Если вам нужно вычислить факториал, используйте быстрый алгоритм: http://www.luschny.de/math/factorial/FastFactorialFunctions.htm
Ответ 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;
}