-1

何らかの理由で、これは常に値1を返します。これのポイントは、最も多くの回数(j = 1まで)ループする開始番号(1〜1,000,000)を見つけることです。jは最終的には常に1になります(コラッツ理論)。偶数の場合はjを2で除算し、奇数の場合は3で倍数して1を加算します。

#include <iostream>
using namespace std;

int collatz() {
int counter = 0;
int holder = 0;

for (int i = 999999; i > 1; i--){           // loops 999,999 times
    for (int j = i; j != 1; counter++) {    // loops until j = 1, records amount of loops
        if (j % 2 == 0) {                   // if j is even, divide by 2, +1 to counter
            j = j / 2;
        } else {
            j = (j*3) + 1;                  // if j is odd, multiply by 3 and add 1, +1 to counter
        }
    }
    if (holder < counter){          // records highest number of loops
    holder = counter;
    counter = 0;
    } else {
    counter = 0;
    }


}
    return holder;
}

int main()
{
    cout << collatz << endl;
    return 0;
}
4

2 に答える 2

3

関数を呼び出すのではなく、関数ポインター(booltrue(つまり1)に変換される)を出力します。

于 2013-03-21T10:22:08.220 に答える
1

まず、unsigned intまたはunsigned long longをの変数タイプとして使用jして、算術範囲を拡大します。

次に、ループでオーバーフローを確認します。

 while (j!=1) {
    counter++;
    if (j % 2 == 0) {
        j >>= 1;
    } else {
        unsigned int j2 = j;
        j = (j*3) + 1;
        if (j2 > j) {
           return -1;  // or surround this with try/catch/throw exception
        }
   }
 }

カウンタを使用int i;すると、i==113383でオーバーフローします。
これらがunsigned int i;チェックされていない場合、無限ループの可能性があります。

于 2013-03-21T10:35:20.577 に答える