質問: 0: n += 1 num += 1 if num > b: break print(n) ``` とした場合に永遠に処理され続ける理由が分かりません。 if文の理解が不十分なのが原因ですが、aizu online judgeのdiscussionには誰も投稿しておらず、 どなたか解説をしていただけたらと思っている次第です。 よろしくお願い致します。
回答: 例示は理解の試金石です。具体的な `a`, `b`, `c` を設定して、プログラムがどのように動くのか手で紙に書いて確かめてみてください。 たとえば、`a = 2`, `b = 5`, `c = 6` のとき、後者のプログラムはどう動くでしょうか。 最初に `n = 0`、`num = 2` が代入されます。 続いてループです。最初の繰り返しでは、`c % num`、つまり `6 % 2` が `0` になるので最初の if 文の中身が実行されます(`n += 1`、`num += 1`)。ふたつ目の if 文は `num > b` では無いのでスキップします。これでループ終端なので最初に戻ります。 2回目の繰り返しでも同じように回っていきます。もう一度書くのは煩雑なので、この後どうなっていくか表にしてみました。 ``` ※一番左はループ回数です | n | num | c % num | num > b | 挙動 1 | 0 | 2 | 0 | False | n += 1, num += 1 2 | 1 | 3 | 0 | False | n += 1, num += 1 3 | 2 | 4 | 2 | False | (変数に変化なし) 4 | 2 | 4 | 2 | False | (変数に変化なし) 5 | 2 | 4 | 2 | False | (変数に変化なし) : ``` こうして書くと、`num` が一切変化しないので絶対に `break` にはたどり着けないと分かります。つまりこのループは無限ループになってしまいます。 より詳しく理解するため、前者のプログラムではどうなるかの表を作ってみてください。`num` が毎回 1 増えるのでいずれはループから抜けることが理解できるはずです。 ここまで理解できれば、`n` や `num` などそれぞれの変数がどういう役割をもっているのかを考えてみてください。`n` は今調べている約数の数、`num` は今 "見ている" 数で、`a` から `b` まで増えていきます。この `num` は 1 回のループで必ず 1 以上増えるべきで、したがって前者のように書くべきです。