
[code]

    ZeroDivisionError: integer division or modulo by zero
    
[/code]

以下がコードです.

[code]

    def Euclidean_algo(m, n):
    
        while m%n != 0:
            m = n
            n = m%n
        else:
            return n
    
    
    m = int(input('the bigger int is :'))
    n = int(input('the smaller int is :'))
    print(Euclidean_algo(m, n))
    
[/code]


CC BY-SA 4.0
2018-07-14T16:53:40.383
46616
2018-07-15T01:15:03.003
2018-07-15T01:15:03.003
29315
question
python アルゴリズム
ユークリッドの互除法でZeroDivisionErrorが発生する原因について


私も一瞬ユークリッドの互除法を正しく実装しているように見えたのですが、実行してみてやっと気づきました。

この2行

[code]

        m = n
        n = m%n
    
[/code]

最初に`m`へ現在の`n`の値が代入されるので、2行目の`n =
m%n`が実行される時には`m`と`n`の値が同じになっています。よって、`m%n`の結果は必ず`0`になってしまいますから、ループの次の条件判定`m%n
!= 0`の中で`n`が`0`なのでゼロ除算例外が発生してしまうわけです。

単純に2行の順番を入れ替えると今度は`m`に入れるべき古い方の`n`の値が失われてしまいます。pythonなら同時に代入してしまえば良いでしょう。

[code]

    def Euclidean_algo(m, n):
        while m % n != 0:
            m, n = n, m % n
        return n
    
[/code]

こんな定義にして試してみてください。ちなみにユークリッドの互除法は二数の大小関係に関わらず働くので、`m`が大きい方の数、なんて指定は不要です。


CC BY-SA 4.0
2018-07-14T17:28:04.970
46618
2018-07-14T17:28:04.970
13972
46616
answer