2013-03-03 74 views
1

所以我有这个计划:调试Python程序LCM

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语句把两个NUM按顺序排列。 任何人都知道为什么会发生这种情况?
谢谢。

+1

顺便说一句,一个快捷方式解决这一问题将是'functools.reduce(LCM ,范围(1,21))' – Blender 2013-03-03 10:08:13

+0

如果是抱怨ng关于第二行,然后在某个点'x == 0',并且你正在尝试'y%x' - 也就是'y%0',这会产生错误。 – Volatility 2013-03-03 10:22:11

回答

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 % x0,然后你做x % y后直接。这将是一个工作的解决方案:

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

这是从维基百科的文章(2.2)直接取自Euclid's algorithm

+0

好的,但现在它返回'ZeroDivisionError:float modulo' – user2128561 2013-03-03 09:58:38

+0

@ user2128561那是因为你的'gcd'函数也搞砸了 – Volatility 2013-03-03 09:59:58

+0

怎么样? @Volatility – user2128561 2013-03-03 10:04:30

0

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