1

だから私はこのプログラムを持っています:

def gcd(x, y):
    while y % x != 0:
        y = y % x
        x = x % y
    return y
def lcm(x, y):
    (x * y) / gcd(x, y)
a = lcm(1, 2)
b = lcm(3, a)
c = lcm(b, 4)
d = lcm(5, c)
e = lcm(6, d)
f = lcm(e, 7)
g = lcm(f, 8)
h = lcm(9, g)
i = lcm(h, 10)
j = lcm(11, i)
k = lcm(12, j)
l = lcm(k, 13)
m = lcm(l, 14)
n = lcm(15, m)
o = lcm(n, 16)
p = lcm(17, o)
q = lcm(18, p)
r = lcm(q, 19)
print(lcm(r, 20))

わかりましたので、この投稿の回答のおかげで解決しましたが、なぜこれを行うのですか:

def gcd(x, y):
        while y % x != 0:
            y = y % x
            x = x % y
        return y
    def lcm(x, y):
        return (x * y) / gcd(x, y)
    a = lcm(1, 2)
    b = lcm(3, a)
    c = lcm(b, 4)
    d = lcm(5, c)
    e = lcm(6, d)
    f = lcm(e, 7)
    g = lcm(f, 8)
    h = lcm(9, g)
    i = lcm(h, 10)
    j = lcm(11, i)
    k = lcm(12, j)
    l = lcm(k, 13)
    m = lcm(l, 14)
    n = lcm(15, m)
    o = lcm(n, 16)
    p = lcm(17, o)
    q = lcm(18, p)
    r = lcm(q, 19)
    print(lcm(r, 20))

これを返します:

ZeroDivisonError: float modulo

if2行目について文句を言うと、2つの数字を並べ替えるには何らかのステートメントが必要かもしれません. なぜこれが起こっているのかについての情報はありますか?
ありがとう。

4

2 に答える 2

2

関数return内で何かを忘れました。lcm

def lcm(x, y):
    return (x * y) / gcd(x, y)

関数で明示的に何も返さない場合、Pythonは自動的にを返しますNone。を試してみるとlcm(r, 20)、それはと同じです。これは、関数lcm(None, 20)で両方のパラメーターを乗算するためlcm機能しません。実行することはできませんNone * 20

ただし、これにより別のエラーが発生します。gcd関数にも問題があります。

がの場合にエラーが発生しy % x0その後x % yすぐに実行します。これは実用的な解決策になります。

def gcd(x, y):
    while y != 0:
        x, y = y, x % y
    return x

これは、ウィキペディアの記事(セクション2.2)のユークリッドのアルゴリズムから直接引用したものです。

于 2013-03-03T09:54:25.027 に答える
0

ここには誤解があります。 inside を使用するとgcd()lcm()ネストされた環境が作成されます。gcd()の環境はグローバル環境にアクセスできません。それが返すものはすべて、の環境からアクセスできますlcm()。のグローバル環境には何も返さないlcm()ため、Python はデフォルトで を返しますNone。これを修正するには:

def lcm(x, y):
    return (x * y) / gcd(x, y)

また、例外のlcm()スローを避けるために、このブロックをに追加する必要があります。ZeroDivision

def lcm(x, y):
    try:
        return (x * y) / gcd(x, y)
    except ZeroDivisionError:
        do whatever you want and return a value 
于 2013-03-03T10:02:14.837 に答える