我正在使用 ulong 作为 100 的阶乘,但它仍然溢出

I'm using ulong for the factorial of 100, but it still overflows

所以我的任务是:我有数字 100,我必须打印它的阶乘数字的总和。

所以我编写了代码,找到了一种很好的数字求和方法,但我的代码不适用于数字 100。我检查了 10,它完美地工作。我想到的第一步是,我必须将类型从 int 更改为更大的类型。我知道(阶乘的)结果将是一个巨大的正数,所以我选择了 ulong,但它仍然不起作用。我在 Stack Overflow 上查了一下,我发现的唯一答案是使用 '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();
    }
}

所有整数类型都有限制。 unsigned long int 增加了上限。但显然还远远不够。正如其他人在评论中所说,ulong是做空100+数量级。

对于如此庞大的数字,有两种选择:

  1. 使用浮点数。假设您可以忍受它们固有的不精确性和所有其他 Floating point stuff.
  2. 使用BigInteger。那个只会 运行 进入限制,例如最大对象大小或可寻址的 RAM。所以你最多应该节省 2 GiB 左右。

就我个人而言,我倾向于将运算压缩到 BigInt 中,而不是使用浮点数。但那是个人的事。

我一直在研究自己的大型数学研究项目。您可以使用 .NET BigInteger class(在 System.Numerics 下),但它不是目前最高效的库。

如果您不依赖 .NET,我建议您使用 GNU 多精度算术库 (https://gmplib.org/)。它速度更快,功能也更多。您将需要研究文档以学会正确使用它。

它的端口确实存在,尽管从 API 的角度我还没有看到一个很好的端口 - 在 Nuget 上搜索。