ここで何が間違っていますか?
6 または 7 で割り切れる 1 ~ 100 の整数を表示したいと考えています。次のステップは、両方で割り切れるものを表示しないことです...それは私のループでは機能しません(これらの整数はまだ表示されています)
for (int i = 1; i < 100; i++)
if (i % 6 == 0 || i % 7 == 0 && i % (6 * 7) != 0){
println(i);
}
ありがとう!ジョエル
ここで何が間違っていますか?
6 または 7 で割り切れる 1 ~ 100 の整数を表示したいと考えています。次のステップは、両方で割り切れるものを表示しないことです...それは私のループでは機能しません(これらの整数はまだ表示されています)
for (int i = 1; i < 100; i++)
if (i % 6 == 0 || i % 7 == 0 && i % (6 * 7) != 0){
println(i);
}
ありがとう!ジョエル
次のように (...) を追加して、条件をより明確にしてみてください。
if (((i % 6 == 0 || i % 7 == 0) && (i % (6 * 7) != 0)) {
}
デフォルトでは && は || よりも優先されます。
括弧がありません:
for (int i = 1; i < 100; i++) {
if ((i % 6 == 0 || i % 7 == 0) && i % (6 * 7) != 0) {
println(i);
}
}
排他的または
for (int i = 1; i < 100; i++) {
if ((i % 6 == 0) ^ (i % 7 == 0)) {
println(i);
}
}
または単に不等if ((i % 6 == 0) != (i % 7 == 0))
排他的な or はあまり使用されないため、これによりコードの可読性が向上するとは思えません...
優先順位を評価する方法について心配するのをやめて、次のようなものを使用します。
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 の倍数でない場合は出力します。
for (int i = 1; i < 100; i++)
if ((i % 6 == 0 || i % 7 == 0) && !(i % 6 == 0 && i % 7 == 0)){
println(i);
}