-1

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

2 回答 2

2

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

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

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

于 2018-10-22T16:23:44.660 回答
1

所有整数类型都有限制。unsigned long int 增加了上限。但显然还远远不够。正如其他人在评论中所说的那样,ulong 的空头要少 100 多个数量级。

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

  1. 使用浮点数。假设您可以忍受它们固有的不精确性和所有其他浮点数
  2. 使用BigInteger。那个只会遇到最大对象大小或可寻址 RAM 等限制。因此,您最多可以节省 2 GiB 左右。

就个人而言,我倾向于将操作压缩到 BigInt 中,而不是使用浮点数。但那是个人问题。

于 2018-10-22T16:21:32.280 回答