我正在使用 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+数量级。
对于如此庞大的数字,有两种选择:
- 使用浮点数。假设您可以忍受它们固有的不精确性和所有其他 Floating point stuff.
- 使用BigInteger。那个只会 运行 进入限制,例如最大对象大小或可寻址的 RAM。所以你最多应该节省 2 GiB 左右。
就我个人而言,我倾向于将运算压缩到 BigInt 中,而不是使用浮点数。但那是个人的事。
我一直在研究自己的大型数学研究项目。您可以使用 .NET BigInteger class(在 System.Numerics 下),但它不是目前最高效的库。
如果您不依赖 .NET,我建议您使用 GNU 多精度算术库 (https://gmplib.org/)。它速度更快,功能也更多。您将需要研究文档以学会正确使用它。
它的端口确实存在,尽管从 API 的角度我还没有看到一个很好的端口 - 在 Nuget 上搜索。
所以我的任务是:我有数字 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+数量级。
对于如此庞大的数字,有两种选择:
- 使用浮点数。假设您可以忍受它们固有的不精确性和所有其他 Floating point stuff.
- 使用BigInteger。那个只会 运行 进入限制,例如最大对象大小或可寻址的 RAM。所以你最多应该节省 2 GiB 左右。
就我个人而言,我倾向于将运算压缩到 BigInt 中,而不是使用浮点数。但那是个人的事。
我一直在研究自己的大型数学研究项目。您可以使用 .NET BigInteger class(在 System.Numerics 下),但它不是目前最高效的库。
如果您不依赖 .NET,我建议您使用 GNU 多精度算术库 (https://gmplib.org/)。它速度更快,功能也更多。您将需要研究文档以学会正确使用它。
它的端口确实存在,尽管从 API 的角度我还没有看到一个很好的端口 - 在 Nuget 上搜索。