【问题标题】:How can I reduce the number of conditions in a statement? [duplicate]如何减少语句中的条件数量? [复制]
【发布时间】:2020-08-13 04:04:28
【问题描述】:

在这个练习中,我需要想出一种方法来找到前 20 个自然数 (1-20) 的最小公倍数 (LCM)。 到目前为止,这是我得到的:

if exercise == 34:
    lcm = 20
    while lcm % 2 != 0 or \
            lcm % 3 != 0 or \
            lcm % 4 != 0 or \
            lcm % 5 != 0 or \
            lcm % 6 != 0 or \
            lcm % 7 != 0 or \
            lcm % 8 != 0 or \
            lcm % 9 != 0 or \
            lcm % 10 != 0 or \
            lcm % 11 != 0 or \
            lcm % 12 != 0 or \
            lcm % 13 != 0 or \
            lcm % 14 != 0 or \
            lcm % 15 != 0 or \
            lcm % 16 != 0 or \
            lcm % 17 != 0 or \
            lcm % 18 != 0 or \
            lcm % 19 != 0 or \
            lcm % 20 != 0:
        lcm += 1
    print(lcm)

是否有更高效的方法来编写代码,而无需为要在循环中考虑的每个潜在数字编写条件?

【问题讨论】:

    标签: python loops while-loop


    【解决方案1】:

    这里是一个较短的版本,把长的or替换成any

    if excercise == 34:
        lcm = 20
        while any(lcm % i != 0 for i in range(2, 21)):
            lcm += 1
        print(lcm)
    

    【讨论】:

    • 好在这保留了原始表达式的短路。
    • 我不知道我是否做错了什么,但这段代码似乎处于无限循环中,尽管它以较小的间隔工作
    • @Milky 好吧,我想你可以说它似乎处于无限循环中。当然它最终会完成,但正如我在回答中所说,这“需要很长时间”。
    【解决方案2】:

    我会说最好的方式will be这个:

    >>> math.lcm(*range(1, 21))
    232792560
    

    由于结果相当大,无论其他人做得多么好,您的+= 1 循环都会花费很长时间。

    Python 3.9 之前的最佳方式可能是这样的:

    >>> def lcm(a, b):
            return a * b // math.gcd(a, b)
    
    >>> functools.reduce(lcm, range(1, 21))
    232792560
    

    这两种方式都只需要几微秒。

    或者...只需稍加努力,您就可以乘以该范围内所有素数的最大幂:

    >>> 16*9*5*7*11*13*17*19
    232792560
    

    【讨论】:

    • 这个新的 Python 3.9 函数会保留算法的短路功能吗?
    • @Milky 不知道你的意思。这个问题真的没有意义。它会短路什么?
    • 我的意思是它是否会在找到 LCM 后立即停止迭代?
    • @Milky 迭代是什么意思?像你的?它不这样做。库函数使用这种糟糕的方法真的很糟糕。
    • @Milky 它与我的第二个解决方案几乎相同。它不在文档中,您必须查看源代码。
    猜你喜欢
    • 2016-02-28
    • 2021-02-02
    • 2016-12-08
    • 2017-01-08
    • 2016-09-09
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多