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 ライブラリを使用してください。Bignum は、無制限の精度とサイズを提供します。

于 2012-09-20T13:41:29.743 に答える
1

これ

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

intオーバーフローのずっと前に、誤った結果を生成します。に変更します

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