-3

素数を生成する関数があります。

内側の「for ループ」には 2 つの条件チェック ステートメントがあり、最終的には内側の「for ループ」が壊れます。したがって、内側の for ループが壊れた後、制御は外側の for ループに移り、再び内側のループに移ります。 for ループが検出され、内側の for ループが のインクリメントされた値で実行を開始しますk

値がインクリメントされたとき、代わりに、指定された条件の実行を中断しますifか? 関数内でのこのコードの動作を説明してくれる人はいますか?

public void prime()

    {
        int i = 5;

        for (int j = 2; j <= i; j++)
        {
            for (int k = 2; k <= i; k++)
            {
                if (j == k)
                {
                    Console.WriteLine(j);

                    break;
                }
                else if (j % k == 0)
                {
                    break;
                }
            }
        }

    }

出力:

2
3
5
4

3 に答える 3

0

とにかく、ここに詳細なウォークスルーがあります...は for ループ内で宣言されているkため、毎回 2 から始まります。k最初の実行...j = 2 k =2したがって、最初のif条件が満たされます。ブレークはそれを外側の for ループに戻し、j3 にインクリメントしますj = 3 k = 2。k 増分...j = 3 k =3最初の if と break の条件を満たします。j増分... j = 4 k =2. 最初のパススルーにより、2 番目の if 式は true を返します4 % 2 == 0。内側の for ループを中断し、外側のループに戻ります。jが 5 にインクリメントされるまで内側のループを実行しk、最初の if 条件が true に検証されます。2 番目の if 条件jは、偶数である場合にのみ true と検証され、ループの最初の繰り返しで検証されます。

于 2013-06-28T16:50:35.903 に答える
0

ブレークが発生すると、内側のループから抜け出し、ループの後に継続します。内側のループは外側のループにある唯一のものなので、外側のループの次の繰り返しが実行されます。これは増加しますj。内側のループが再度実行されると、kは元に戻され2、ループが再び開始されます。k(外側のループの前の反復からの)の前の値は失われます。

関数自体は、jカウントアップし、それよりも小さいすべての数 ( の値k) をチェックして素数を生成し、j % k == 0(素数ではない、k は j の因数である) またはj == k(これまでに素数が見つからないため、j は素数でなければなりません) を確認します。

内側のループ自体は技術的には にループしますiが、k到達jするとループが抜けて、が等しい場合kにのみ到達します。iji

于 2013-06-28T16:50:57.863 に答える
0

これは強引な方法です。 からのすべての数値を2 .. limit以前のすべての数値 (再び、 から2 .. current) に対してテストし、倍数を検索します。倍数が見つかった場合、その数値は素数ではありません。

理解しやすくするために、コードにいくつかのコメントを追加しました。

public void prime () {
    int limit = 5;

    /**
     * Starting at 2, assuming the first prime number is 2
     * Test all numbers against any number from 2, if the
     * number being tested is a multiple of some other
     * previous number, that number is NOT a prime
     */
    for (int being_tested = 2; being_tested <= limit; being_tested++) {
        for (int previous_value = 2; previous_value <= limit; previous_value++) {
            /**
             * If previous_value == being_tested then
             * no multiples have been found
             * thus "being_tested" is a prime number
             */
            if (being_tested == previous_value) {
                Console.WriteLine(being_tested);
                break;
            }
            /**
             * If modulus == 0 then "being_tested"
             * is a multiple of previous_value,
             * therefore, not a prime number
             */
            else if (being_tested % previous_value == 0) {
                break;
            }
        }
    }
}

注: 私が投稿した元のコードでは、条件が反転していて、期待どおりに実行されませんでした。指摘してくれた@Cemaforのおかげです。

于 2013-06-28T17:00:40.773 に答える