调试Python程序LCM
所以我有这个计划:调试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按顺序排列。 任何人都知道为什么会发生这种情况?
谢谢。
您忘记了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 % x
为0
,然后你做x % y
后直接。这将是一个工作的解决方案:
def gcd(x, y):
while y != 0:
x, y = y, x % y
return x
这是从*的文章(2.2)直接取自Euclid's algorithm。
好的,但现在它返回'ZeroDivisionError:float modulo' – user2128561 2013-03-03 09:58:38
@ user2128561那是因为你的'gcd'函数也搞砸了 – Volatility 2013-03-03 09:59:58
怎么样? @Volatility – user2128561 2013-03-03 10:04:30
这里有一个误解。当您在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
顺便说一句,一个快捷方式解决这一问题将是'functools.reduce(LCM ,范围(1,21))' – Blender 2013-03-03 10:08:13
如果是抱怨ng关于第二行,然后在某个点'x == 0',并且你正在尝试'y%x' - 也就是'y%0',这会产生错误。 – Volatility 2013-03-03 10:22:11