1

我正在尝试使用 VS2010 c++ 解决 3n+1 问题,在小输入中它运行良好,但是当它达到 113383 时它会溢出。

这是问题链接

这是我用来解决这个问题的代码:

#include <iostream>
using namespace std;
int main(void) {
    while (!cin.eof()) {
        int i, j, maxCycle = 0, tmaxCycle = 0;
        cin >> i >> j;
        for (int x = i; x <= j; x++) {
            int n = x;
            tmaxCycle = 0;
            while (n != 1) {
                if ((float)(n/2) != (n/2.0)) {
                    n = 3*n + 1;
                }
                else {
                    n /= 2;
                }
                tmaxCycle += 1;
                if (n < 0) {
                    int blah = 0; //just for the breakpoint
                } 
            }
            tmaxCycle += 1;
            if (tmaxCycle > maxCycle) {
                maxCycle = tmaxCycle;
            }
        }
        cout << i << "\t" << j << "\t" << maxCycle << endl;
    }
    system("pause");
}

我在第 15 行做了一个断点,此时值溢出

n=-1812855948 
4

2 回答 2

2

使用 64 位无符号整数。如果这些溢出,请使用像GNU Multiple Precision Library这样的 bignum 库。Bignums 为您提供无限的精度和大小。

于 2012-09-20T13:41:29.743 回答
1

if((float)(n/2)!=(n/2.0))

int在溢出之前很久就会产生不正确的结果。将其更改为

if ( n & 1)
于 2012-09-20T13:24:04.417 回答