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

时间:2018-10-22 16:10:44

标签: c# int overflow factorial ulong

所以我的任务是:我有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();
    }
}

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

所有整数类型都有限制。 unsigned long int增加了上限。但是显然还远远不够。正如其他人在评论中所说,乌龙茶将短缺100个数量级。

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

  1. 使用浮点数。假设您可以忍受其固有的不精确性以及所有其他Floating point stuff
  2. 使用BigInteger。那只会遇到最大对象大小或可访问RAM之类的限制。因此,您最多应保存2 GiB左右。

我个人倾向于将操作压缩到BigInt中,而不是使用浮点数。但这是个人事务。