-1

私はプロジェクトオイラーの問題5を解決しようとしていますが、私が得続ける答えは間違っています:

#include <stdio.h>

main() 
{
    int num;
    int x = 0;
    for (num = 20; x == 0; num++)
    {
        if ((num%1) == 0 && (num%2) == 0 && (num%3) == 0 && (num%4) == 0 && (num%5) == 0 && (num%6) == 0 && (num%7) == 0 && (num%8) == 0 && (num%9) == 0 && (num%10) == 0 && (num%11) == 0 && (num%12) == 0 && (num%13) == 0 && (num%14) == 0 && (num%15) == 0 && (num%16) == 0 && (num%17) == 0 && (num%18) == 0 && (num%19) == 0 && (num%20) == 0)
        x = 1;
    }
    printf("%d %d", num, x);
}

私のプログラムは印刷を続けます232792561(私はxを印刷していることを知っています、これは単にトラブルシューティングの目的のためです)。

私が得ている逐語的な出力は次のとおり232792561 1です。

調べてみたところ、問題の正解はです232792560。私は今、問題はforループにあると信じ始めています。

ループは最初に何をしますか、反復(num++)またはテスト(x == 0)?

4

4 に答える 4

14

for ループは、同等の while ループに変換できます。

for (num = 20; x == 0; num++) {
    // do stuff
}

と同じです

num = 20;
while (x == 0) {
    // do stuff, then
    num++;
}

したがって、最初に条件がチェックされ、次にループ本体が実行され、次にインクリメントが実行されます。

(そして、他の人が示唆したように、必要なときにループから抜け出すと、すぐにループから飛び出すbreak;ため、正しい結果が必要になります。したがって、インクリメントステートメントは最後に実行されません。)break;

于 2013-03-03T19:41:37.727 に答える
7

ループ本体が実行された後(最初に初期化コードが実行されたため、条件がチェックされて本体が入力されているかどうかが確認されます)、

  • 最初に更新コードが実行されます
  • 次に、条件がチェックされます。

したがって、x1に設定すると、numもう一度インクリメントされます。

xループを終了するために1に設定する代わりにbreak;、更新コードを実行せずにループを終了することができます。

于 2013-03-03T19:40:24.130 に答える
1

ループは不必要に複雑であり、必要にwhile応じてループ構造を使用して単純化できます。不要な変数を取り除くこともできますx

int main() {
    int num = 20;
    while (!((num%1) == 0 && (num%2) == 0 && (num%3) == 0 && (num%4) == 0 && (num%5) == 0 && (num%6) == 0 && (num%7) == 0 && (num%8) == 0 && (num%9) == 0 && (num%10) == 0 && (num%11) == 0 && (num%12) == 0 && (num%13) == 0 && (num%14) == 0 && (num%15) == 0 && (num%16) == 0 && (num%17) == 0 && (num%18) == 0 && (num%19) == 0 && (num%20) == 0))
    {
        ++num;
    }
    printf("%d\n", num);
    return 0;
}

forループが間違った答えを出した理由に答えるには:

x = 1の正しい値を設定していましたが、ループの次の繰り返し (つまり、ステートメントの実行後) でONLYnumの状態をチェックしていたため、 の値は1 オフセットされていました。for loopnum++num

多くの人が示唆したように、breakステートメントを使用して for ループの実行を終了しnum、コントロールがループの外側に到達したときに の値が希望どおりになるようにすることができます。

于 2013-03-03T19:44:56.307 に答える
0

ステップ 1: 初期化 ( num = 20)
ステップ 2: テスト
ステップ 3: 反復
ステップ 4: テスト
ステップ 5: 反復
など。

私があなただったら、whileインクリメントの本体を使用して、あなたのものとして条件付きのループを選択します(つまり、ループ内の長いものを意味します)。

于 2013-03-03T19:41:31.050 に答える