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

抱怨第二行,我想我可能需要某种if声明来按顺序排列这两个数字。有人知道为什么会这样吗?
谢谢。

4

2 回答 2

2

您忘记returnlcm函数中的某些内容。

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

当您没有在函数中显式返回任何内容时,Python 会自动返回None. 当您尝试lcm(r, 20)时,这与lcm(None, 20), 因为您将函数中的两个参数相乘而lcm不起作用 - 您不能这样做None * 20

然而,这会产生另一个错误——你的gcd函数也有问题!

错误发生在y % xis时0,然后你马上就做x % y。这将是一个可行的解决方案:

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

这直接取自Wikipedia 文章(第 2.2 节)中的Euclid 算法。

于 2013-03-03T09:54:25.027 回答
0

这里有一个误解。当你使用gcd()insidelcm()时,你正在创建嵌套环境。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 回答