Я использую ulong для факториала 100, но он все еще переполняется - PullRequest
0 голосов
/ 22 октября 2018

Итак, моя задача: у меня есть число 100, и я должен вывести сумму цифр его факториала.

Итак, я написал код, нашел хороший способ суммирования цифр, но мой код не работает для числа 100. Я проверил на 10, и он отлично работает.Первый шаг, который пришел мне в голову, я должен изменить тип с int на что-то большее.Я знаю, что результат (факториала) будет огромным положительным числом, поэтому я выбираю ulong, но он все равно не работает.Здесь я проверил переполнение стека, и единственные ответы, которые я нашел, предлагали использовать 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 ]

0 голосов
/ 22 октября 2018

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

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

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

0 голосов
/ 22 октября 2018

Все целочисленные типы имеют ограничения.unsigned long int увеличил верхний предел.Но, видимо, недостаточно далеко.Как уже говорили другие в комментариях, ulong должен быть коротким на 100+ порядков.

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

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

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

...