首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试Python程序LCM

调试Python程序LCM
EN

Stack Overflow用户
提问于 2013-03-03 17:53:16
回答 2查看 197关注 0票数 1

所以我有这个程序:

代码语言:javascript
复制
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))

好了,多亏了这篇文章上的答案,我现在已经解决了这个问题,但是为什么要这样做:

代码语言:javascript
复制
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))

返回如下内容:

代码语言:javascript
复制
ZeroDivisonError: float modulo

抱怨第二行,我猜我可能需要某种if语句来整理这两个数字。有谁知道为什么会发生这种事吗?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-03-03 17:54:25

您忘记了在lcm函数中return一些东西。

代码语言:javascript
复制
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。这将是一个可行的解决方案:

代码语言:javascript
复制
def gcd(x, y):
    while y != 0:
        x, y = y, x % y
    return x

这直接取自维基百科文章中的Euclid's algorithm (第2.2节)。

票数 2
EN

Stack Overflow用户

发布于 2013-03-03 18:02:15

lcm()中使用gcd()有一个误解,你是在创建嵌套环境。gcd()的环境没有访问它返回的全局environment.anything的权限,它将被lcm()的environment.you访问。在lcm()中不向全局环境返回任何内容,所以默认情况下,python会返回None.to修复这个尝试:

代码语言:javascript
复制
def lcm(x, y):
    return (x * y) / gcd(x, y)

此外,您必须将此块添加到lcm()中,以避免抛出ZeroDivision异常:

代码语言:javascript
复制
def lcm(x, y):
    try:
        return (x * y) / gcd(x, y)
    except ZeroDivisionError:
        do whatever you want and return a value 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15184462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档