(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+ порядков.

Для таких огромных чисел есть два варианта:

  1. используйте числа с плавающей точкой. Если предположить, что вы можете жить с присущей им неточностью и всеми остальными вещами с плавающей точкой.
  2. Используйте BigInteger. Он будет работать только в таких пределах, как максимальный размер объектов или доступная оперативная память. Таким образом, вы должны сэкономить до 2 ГиБ или около того.

Лично я склонен втискивать операции в BigInt, а не использовать числа с плавающей точкой. Но это личное дело.

Я играл с моими собственными большими математическими исследовательскими проектами. Вы можете использовать класс.NET BigInteger (в System.Numerics), но это не самая эффективная библиотека.

Если вы не застряли в.NET, я бы предложил использовать арифметическую библиотеку GNU Multiple Precision ( https://gmplib.org/). Это гораздо быстрее и имеет гораздо больше функциональности. Вам нужно будет изучить документы, чтобы научиться правильно их использовать.

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

Другие вопросы по тегам