2

ここで何が間違っていますか?

6 または 7 で割り切れる 1 ~ 100 の整数を表示したいと考えています。次のステップは、両方で割り切れるものを表示しないことです...それは私のループでは機能しません(これらの整数はまだ表示されています)

for (int i = 1; i < 100; i++)
    if (i % 6 == 0 || i % 7 == 0 && i % (6 * 7) != 0){
        println(i);
    }

ありがとう!ジョエル

4

5 に答える 5

5

次のように (...) を追加して、条件をより明確にしてみてください。


if (((i % 6 == 0 || i % 7 == 0) && (i % (6 * 7) != 0)) {
}

デフォルトでは && は || よりも優先されます。

于 2010-03-03T07:40:48.857 に答える
3

括弧がありません:

for (int i = 1; i < 100; i++) {
    if ((i % 6 == 0 || i % 7 == 0) && i % (6 * 7) != 0) {
        println(i);
    }
}
于 2010-03-03T07:41:31.760 に答える
2

排他的または

    for (int i = 1; i < 100; i++) {
        if ((i % 6 == 0) ^ (i % 7 == 0)) {
            println(i);
        }
    }

または単に不等if ((i % 6 == 0) != (i % 7 == 0))
排他的な or はあまり使用されないため、これによりコードの可読性が向上するとは思えません...

于 2010-03-03T08:32:12.983 に答える
2

優先順位を評価する方法について心配するのをやめて、次のようなものを使用します。

for (int i = 1; i <= 100; i++) {
    if ((i % 42) == 0) continue;
    if ((i %  6) == 0) println (i);
    if ((i %  7) == 0) println (i);
}

ここでは、1 ~ 100 が包括的な範囲であると想定してい<=ます<。100 は 6 でも 7 でも割り切れないため、特定のケースでは問題になりません。

何だと思う?適切な最適化コンパイラ (JIT コンパイラを含む) は、おそらく他のすべての可能性と同じコードを生成することになります。そして、そうでなかったとしても、この関数を度も呼び出さない限り問題にはなりません。

私はそれがより少し読みやすいと思います:

if (i % 6 == 0 || i % 7 == 0 && i % (6 * 7) != 0) ...

または、さらに悪いことに、適切に動作させるためには、Lisp のようなものに変換する必要があります :-)


1 つの可能性を念頭に置いてください。6 と 7 の特定のケースでは、ループを変更してより効率的に (7 倍に) することができます。

for (int i = 7; i <= 100; i += 7)
    if ((i % 6) != 0)
        println (i);

これは、forループ自体を使用して 7 の倍数のみをチェックし、6 の倍数でない場合は出力します。

于 2010-03-03T07:51:46.767 に答える
1
for (int i = 1; i < 100; i++)
if ((i % 6 == 0 || i % 7 == 0) && !(i % 6 == 0 && i % 7 == 0)){
    println(i);
}
于 2010-03-03T07:42:01.837 に答える