64058


具体的に言うとaizu online judge ITP1_3_Dの問題の  
３つの整数 a、b、c を読み込み、a から b までの整数の中に、c の約数がいくつあるかを求めるプログラムを作成してください。  
というものに対して

[code]

    a, b ,c = map(int, input().split())
    n = 0
    num = a
    while True:
      if c%num == 0:
        n += 1
      num += 1
      if num > b:
        break
    print(n)
    
[/code]

では通るのですが、下から4行目のnum += 1の部分をインデントした場合、  
つまり

[code]

    a, b ,c = map(int, input().split())
    n = 0
    num = a
    while True:
      if c%num == 0:
        n += 1
        num += 1
      if num > b:
        break
    print(n)
    
[/code]

とした場合に永遠に処理され続ける理由が分かりません。

if文の理解が不十分なのが原因ですが、aizu online judgeのdiscussionには誰も投稿しておらず、  
どなたか解説をしていただけたらと思っている次第です。

よろしくお願い致します。


CC BY-SA 4.0
2020-03-23T15:28:50.097
64056
2020-03-23T16:12:26.613
2020-03-23T15:50:52.310
19110
36869
question
python python3
While True: の中に内包されているif文内の　indentationの有無によるerrorが起きる理由が分かりません(無限ループの一種かもしれない)


例示は理解の試金石です。具体的な `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回目の繰り返しでも同じように回っていきます。もう一度書くのは煩雑なので、この後どうなっていくか表にしてみました。

[code]

    ※一番左はループ回数です
    
       | 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  | (変数に変化なし)
     :
    
[/code]

こうして書くと、`num` が一切変化しないので絶対に `break` にはたどり着けないと分かります。つまりこのループは無限ループになってしまいます。

より詳しく理解するため、前者のプログラムではどうなるかの表を作ってみてください。`num` が毎回 1
増えるのでいずれはループから抜けることが理解できるはずです。

ここまで理解できれば、`n` や `num` などそれぞれの変数がどういう役割をもっているのかを考えてみてください。`n`
は今調べている約数の数、`num` は今 "見ている" 数で、`a` から `b` まで増えていきます。この `num` は 1 回のループで必ず 1
以上増えるべきで、したがって前者のように書くべきです。


CC BY-SA 4.0
2020-03-23T16:12:26.613
64058
2020-03-23T16:12:26.613
19110
64056
answer