所以,简单的程序,计算一个阶乘数。代码如下。
int calcFactorial(int num)
{
int total = 1;
if (num == 0)
{
return 0;
}
for (num; num > 0; num--)
{
total *= num;
}
return total;
}
现在,对于大多数数字来说,这工作得很好而且很漂亮(当然有更快、更优雅的解决方案,但这对我有用)。但是,当输入更大的数字(例如 250)时,坦率地说,就是废话。现在,250 的前几个阶乘“位”是 { 250, 62250, 15126750, 15438000, 3813186000 } 以供参考。
我的代码吐出 { 250, 62250, 15126750, 15438000, -481781296 } 这显然是关闭的。我的第一个怀疑可能是我违反了 32 位整数的限制,但鉴于 2^32 是 4294967296,我不这么认为。我唯一能想到的可能是它违反了有符号的32 位限制,但它不应该能够考虑这种事情吗?如果被签名是问题,我可以通过使整数无符号来解决这个问题,但这只是一个临时解决方案,因为下一次迭代产生 938043756000 远高于 4294967296 限制。
那么,我的问题是签名限制吗?如果是这样,我能做些什么来计算大数(虽然我有一个“LargeInteger”类我前一段时间可能适合!)而不会再次遇到这个问题?