C# I';我使用ulong作为100的阶乘,但它仍然溢出

C# I';我使用ulong作为100的阶乘,但它仍然溢出,c#,int,overflow,factorial,ulong,C#,Int,Overflow,Factorial,Ulong,所以我的任务是:我有数字100,我必须打印它的阶乘的数字之和 所以我写了代码,找到了一个很好的方法来求和,但是我的代码对数字100不起作用。我检查了10次,结果很好。我想到的第一步是,我必须将类型从int改为更大的类型。我知道(阶乘的)结果将是一个巨大的正数,所以我选择了ulong,但它仍然不起作用。我在这里查看了Stack Overflow,找到的唯一答案是建议使用“BigInteger”,但我的Visual Studio似乎不知道,我想知道为什么ulong不起作用 我的代码: class P

所以我的任务是:我有数字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();
    }
}
类程序
{
静态ulong阶乘(ulong n)//查找x的阶乘
{
ulong事实=n;

对于(ulong i=1;i所有整数类型都有限制。无符号long int增加了上限。但显然还不够。正如其他人在评论中所说,ulong将缩短100+个数量级

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

  • 使用浮点数。你可以接受它们固有的精度和所有其他
  • 使用。这只会遇到最大对象大小或可寻址RAM等限制。因此,您应该最多节省2 GiB左右

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

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

    如果您没有被困在.NET上,我建议您使用GNU多精度算术库()。它速度更快,功能也更多。您需要学习文档以正确使用它


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

    查看
    BigInteger
    ulong
    不够大,无法存储100的阶乘,它有150多个数字,而
    ulong
    仅限于20个。听起来像是euler项目的问题:)我们将告诉您,您可以使用任意数组,您只需要实现数组*数字乘法(这并不难)。您也可以使用BigInteger,但您需要使用System.Numerics;
    100阶乘是9.332622e+157,请参见。
    UInt64。MaxValue
    18446744073709551615
    ,这要少得多。您的
    阶乘方法实际上应该是
    i@JonathonChase:Double有e+308到e-308的限制。这足以存储e 9.332622e+157.js当然不是很精确。这是的链接。好的一点,我想它可以用于近似,但它可能不适用于获得单个数字的总和。@JonathonChase:我同意操作的数量可能会导致大量的复合错误。但是在两个数字之间存储数字“宇宙的大小”和“原子的大小”精确到有限的程度是浮点数存在的唯一原因。这也是我们将它们的计算优化到我们所做的程度的一个原因。所以我觉得它至少值得一提。谢谢!我用BigInteger解决了这个问题。谢谢!我用BigInteger解决了这个问题。