1

Hailstone シーケンスの出力を、int の制限により計算できない最小の整数にしようとしていますが、何らかの理由でまだ機能していません。なぜそうでないのかについてのアイデアは大歓迎です。

    public static void main(String[] args) {
        int x=2; 
        int count = x;
        //Collatz Conjecture computation
        while (true)
        {   x=2; 
            x =count;
            while (x != 1)
            {   
                if (x % 2 == 0)
                    x = x / 2;
                if (x % 2 == 1)
                    x = x * 3 + 1;
                if (x < 0)
                {   System.out.print("The integer " + count + " cannot have its Hailstone sequence computed using int variables. ");
                    return;
                }
            }
            count ++;
        }
    }
4

2 に答える 2

4

実際にやっている様子をご覧ください。print ステートメントは、条件付きの if ステートメント内にありますが、x < 0未満にxなること0はありません。実行している 2 つの操作はxx = x / 2x = x * 3 + 1です。どちらもポジティブをネガティブに変えることはできません。


編集:x < 0 int オーバーフローをテストするためのものであることがわかりこれが発生するという保証はないことに注意してください。シーケンスがサイクルに巻き込まれる可能性があります (xシーケンスが に達すると、そのようなサイクルが1)。ただし、これが発生した場合はwhile-loop壊れて、出力が得られません。別の方法 (私のコメントで示したように) はx、型long(つまりlong x = ...) であり、if 条件を be にすることx > Integer.MAX_VALUEです。


また、これを見てください:

int n = Integer.MAX_VALUE;
System.out.println(3 * n + 1);
2147483646

明らかにオーバーフローがありますが、 の結果3*n + 1は依然として正です。


そして最後に、他の回答に示されているように、最初の 2 つのifステートメント (2 番目のステートメントは である必要があります) に問題があるようです。else if完全を期すために言及しているだけです。

于 2013-01-22T22:46:32.473 に答える
2

現在、の代わりに複数あるため、の無限のシーケンスHailstone sequence到達します。4, 2, 1, 4, 2, 1, ...if'sif-else

のセットを次のように変更する必要がありますif's: -

if (x % 2 == 0)
    x = x / 2;
else
    x = x * 3 + 1;
if (x < 0) {   
    System.out.print("The integer " + count + " cannot have its Hailstone sequence computed using int variables. ");
    return;
}

それで、問題は何でしたか?

だけを使用していた場合if's、ある時点で、あなたのx意志は1最初のif状態になります。

したがって、 ではx = 12 番目ifが実行され、x- 1 * 3 + 1=になり4ます。その後、while ループが続きます。再び( 1stx ) になり、再びループが続き ( Asは現在満たされていません。 )、次に( 1st ) になり、次に( 2nd ) と続きます。両方のブロックが毎回実行されていたため、この問題が発生しました。2ifwhile2nd if2 % 2 != 1x1if4ifif


答えを完成させるために、最後の条件さえ必要ないと思います - x < 0。while ループは、x becomes 1. そして、これがシーケンスを終了する唯一の条件でなければなりません。value1で開始すると、その致命的なシーケンスになってしまうためです。ということで、パーツを外すだけif (x < 0)必要ありません。

したがって、次を使用する必要があります: -

if (x % 2 == 0)
    x = x / 2;
else
    x = x * 3 + 1;

あなたのinner中に。

于 2013-01-22T22:57:07.367 に答える