C ++,整数溢出?

时间:2012-03-07 04:07:45

标签: c++ integer-overflow

我制作了一个程序来查找数字的因子:

#include <iostream>
#include <cmath>
using namespace::std;
int main() {
    long int n = 6008514751432;
    int i = 1;
    while (i <= n/2) {
        if (n % i == 0)
            cout << i << " ";
        i++;
    }
}

我正在使用xCode BTW 它适用于较小的数字,比如说2000,甚至200000。但是,当我达到6008514751432,这是我需要知道的数字时,它不起作用,它只是说程序正在运行并且什么都不显示!发生了什么事?

更新:当我运行程序并等待大约2分钟时,它会说:

Warning: the current language does not match this frame.
Current language:  auto; currently c++
(gdb) 

4 个答案:

答案 0 :(得分:3)

long int在您的实施中可能有4个字节宽,这意味着它只能存储最多2^31 - 12147483647的值。

您可能会尝试切换到long long,这通常较大(大多数平台上为8个字节):

long long n = 6008514751432LL;
long long i = 1LL;
while (i <= n/2) {
    if (n % i == 0)
        cout << i << " ";
    i++;
}

如果仍然不够,则需要查找一些无限精度数字库,例如GMP

答案 1 :(得分:2)

根据您的平台,您会发现6008514751432对于long int类型来说太大了。您需要确保使用的是包含64位整数类型的类型。

此外,如果您只是想找到一个数字的因子,则不需要看高于sqrt(n)因为大于具有相应辅助因子的因子。确保退出循环外的sqrt

long int大于int的系统上,请注意您会发现i包裹到0

答案 2 :(得分:1)

如果它正在运行,在这种特定情况下可能不是整数溢出。

6008514751432/2作为32位int出现负数(-144495672) 所以while循环会立即终止。

整数溢出会导致未定义的行为,因此任何事情都可能发生,但大多数系统的行为都是可预测的

如果它溢出,你的编译器应该警告你,甚至拒绝编译它。

6008514751432的一半仍然是一个相当大的数字,它将花费大量时间来计算那么高,并做所有那些“%”操作。与此同时,前几个因素(1,2,4,8,1307,2614等)已被发送到COUT但尚未刷新,因此这些结果位于缓冲区中,您无法看到它们。

如果您更改程序以将每个数字放在一个可能更早给出某些结果的新行上,那么您仍然需要几天到几周才能获得最终结果。

我建议您寻找更快的保理算法。

Spoiler:FWIW 6008514751432有主要因素

  

2 2 2 1307 574647547

答案 3 :(得分:0)

您假设long int比它大。您应该尝试以下方法:

    分配后
  • 打印n
  • 打印sizeof(int)sizeof(long long)
  • 使用int64_t等。当实际尺寸很重要时,intlong和其他人不是最佳选择。
  • 在循环中添加stdin读取,如果问题仍然存在,请逐步尝试和调试