Pet*_* C. 1 c++ signed factorial
所以,简单的程序,计算一个阶乘数.代码如下.
int calcFactorial(int num)
{
int total = 1;
if (num == 0)
{
return 0;
}
for (num; num > 0; num--)
{
total *= num;
}
return total;
}
Run Code Online (Sandbox Code Playgroud)
现在,对于大多数数字来说,这样做工作得很好而且花花公子(肯定有更快更优雅的解决方案,但这对我有用).然而,当输入更大的数字,如250,它说得直言不讳,疯了.现在,250的前几个因子"位"是{250,62250,15126750,15438000,3813186000}以供参考.
我的代码吐出{250,62250,15126750,15438000,-481781296 },这显然是关闭的.我的第一个怀疑可能是我违反了32位整数的限制,但考虑到2 ^ 32是4294967296,我不这么认为.我唯一能想到的可能是它违反了签名的 32位限制,但它不应该能够考虑这种事情吗?如果签名是问题,我可以通过使整数无符号来解决这个问题,但这只是一个临时解决方案,因为下一次迭代产生938043756000,远高于4294967296限制.
那么,我的问题是签名限制吗?如果是这样,我可以做些什么来计算大数(虽然我已经做了一段时间的"大型英语"课程,但这可能很适合!)而不会再遇到这个问题?
Ste*_*son 21
2 ^ 32不会为您提供有符号整数的限制.
有符号整数限制实际上是2147483647(如果您使用MS工具在Windows上开发,其他工具套件/平台将有自己的限制可能类似).
你需要像这样的C++大数字库.
是的,你达到了极限.根据定义,C++中的int是签名的.而且,呃,不,C++永远不会想到.如果你告诉它做某件事,它会做,即使它显然是错误的.
考虑使用大量库.它们中有很多用于C++.