调试Python程序LCM
所以我有一个计划:调试Python程序LCM,python,debugging,Python,Debugging,所以我有一个计划: 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 =
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
语句来排列这两个数字。
有人知道为什么会发生这种情况吗?谢谢。您忘了在
lcm
功能中返回一些内容
def lcm(x, y):
return (x * y) / gcd(x, y)
当函数中没有显式返回任何内容时,Python会自动返回None
。当您尝试lcm(r,20)
时,这与lcm(None,20)
相同,这不起作用,因为您在lcm
函数中将两个参数相乘-您无法执行None*20
但是,这将产生另一个错误-您的gcd
函数也有问题
当y%x
为0
时,会出现错误,然后您立即执行x%y
。这将是一个有效的解决办法:
def gcd(x, y):
while y != 0:
x, y = y, x % y
return x
这直接取自维基百科文章(第2.2节)。这里有一个误解。当您在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
好的,但是现在它返回的是ZeroDivisionError:float modulo
@user2128561这是因为你的gcd
函数被弄乱了。顺便说一句,解决这个问题的捷径是functools.reduce(lcm,range(1,21))
如果它抱怨第二行,那么在某个点上x==0
,您试图y%x
-也就是说y%0
,这将给出错误。