当我计算一个大因子时,为什么我得到一个负数?

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++大数字库.

  • 好奇的是,这个数字(2,147,483,647)是2 ^ 31 - 1.无符号整数的限制是2 ^ 32 - 1. (4认同)

Ovi*_*vid 13

除了其他评论之外,我还想指出代码中的两个严重错误.

  • 你没有防范负数.
  • 阶乘零是一,而不是零.


Ore*_*ost 9

是的,你达到了极限.根据定义,C++中的int是签名的.而且,呃,不,C++永远不会想到.如果你告诉它做某件事,它会做,即使它显然是错误的.

考虑使用大量库.它们中有很多用于C++.