(C#) Я использую ulong для факториала 100, но он по-прежнему переполняется
Итак, моя задача: у меня есть число 100, и я должен напечатать сумму цифр факториала.
Поэтому я написал код, нашел хороший способ суммирования цифр, но мой код не работает для числа 100. Я проверил на 10, и он отлично работает. Первый шаг, который пришел мне в голову, я должен изменить тип с int на что-то большее. Я знаю, что результат (факториала) будет огромным положительным числом, поэтому я выбираю ulong, но он все равно не работает. Я проверил здесь на stackru, и единственные ответы, которые я нашел, предлагали использовать BigInteger, но моя Visual Studio, похоже, этого не знает, и я хотел бы знать, ПОЧЕМУ ulong не работает.
Вот мой код, спасибо за ответ:
class Program
{
static ulong factorial(ulong n) //finds the factorial of x
{
ulong fact = n;
for (ulong i=1; i<n; i++)
{
fact = fact * i;
}
return fact;
}//***
static ulong digitsum(ulong n) // sums the digits of n
{
ulong sum = 0;
while (n != 0)
{
sum += n % 10;
n /= 10;
}
return sum;
}//***
static void Main(string[] args)
{
ulong x = 100;
Console.WriteLine(digitsum(factorial(x)));
Console.ReadLine();
}
}
2 ответа
Все целочисленные типы имеют ограничения. unsigned long int увеличил верхний предел. Но, видимо, не достаточно далеко. Как сказали другие в комментариях, ulong должен быть коротким на 100+ порядков.
Для таких огромных чисел есть два варианта:
- используйте числа с плавающей точкой. Если предположить, что вы можете жить с присущей им неточностью и всеми остальными вещами с плавающей точкой.
- Используйте BigInteger. Он будет работать только в таких пределах, как максимальный размер объектов или доступная оперативная память. Таким образом, вы должны сэкономить до 2 ГиБ или около того.
Лично я склонен втискивать операции в BigInt, а не использовать числа с плавающей точкой. Но это личное дело.
Я играл с моими собственными большими математическими исследовательскими проектами. Вы можете использовать класс.NET BigInteger (в System.Numerics), но это не самая эффективная библиотека.
Если вы не застряли в.NET, я бы предложил использовать арифметическую библиотеку GNU Multiple Precision ( https://gmplib.org/). Это гораздо быстрее и имеет гораздо больше функциональности. Вам нужно будет изучить документы, чтобы научиться правильно их использовать.
Его порты существуют, хотя я не видел большого порта с точки зрения API - выполните поиск по Nuget.