c++ - 当我计算一个大的阶乘时,为什么我得到一个负数?

标签 c++ signed factorial

所以,简单的程序,计算一个阶乘数。代码如下。

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,我不这么认为。我唯一能想到的可能是它违反了 signed 32 位限制,但它不应该考虑这种事情吗?如果有符号是问题,我可以通过使整数无符号来解决这个问题,但这只是一个临时解决方案,因为下一次迭代产生 938043756000,这远远高于 4294967296 限制。

那么,我的问题是有符号限制吗?如果是这样,我可以做些什么来计算大数(虽然我有一个我刚才制作的“LargeInteger”类可能适合!)而不会再次遇到这个问题?

最佳答案

2^32 没有给你有符号整数的限制。

有符号整数限制实际上是2147483647 (如果您使用 MS 工具在 Windows 上进行开发,其他工具套件/平台可能会有自己的限制,这些限制可能类似)。

您需要一个 C++ 大数库 like this one .

关于c++ - 当我计算一个大的阶乘时,为什么我得到一个负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/236335/

相关文章:

c++ - 如何从资源位图文件中为 directshow 滤镜加载图像数据?

c - 计算有符号整数的最大大小

python - 查找数字列表的阶乘

c++ - 反模的奇怪行为

php - 170+ 的阶乘

c++ - 为char数组赋值

c++ - 在go中删除内存

C++ MVC 模型到 viewmodel "translation"和继承

c - int16_t 是否保证被签名?

android - 安卓apk证书丢失