【问题标题】:Python algorithm doesn't yields correct results only sometimesPython 算法有时不会产生正确的结果
【发布时间】:2021-03-01 10:42:35
【问题描述】:

所以我尝试编写一个算法来计算从 1 到 20 的数字的最小倍数。这是我的代码:

multiples = range(2,11)
check = False
start = 1
while check is False:
    n = [start%i for i in multiples]
    if sum(n) == 0:
        check = True
        print(start)
        
    else:
        start = start+1

事实上,它在range(2,11) 工作并给出正确答案 (2520)。但是,当我尝试将代码缩放到range(2,21) 时,它似乎没有生成答案(它无限循环)。谁能告诉我这是怎么回事?

【问题讨论】:

  • 你到底想做什么?
  • 你确定它崩溃了,还是真的很慢?
  • 这是一个非常低效的算法,实际上它可能可以通过明智地使用 GCD 或类似的东西来解决。在任何情况下,非常最小可能的答案将大于或等于该范围内所有素数的乘积,对于 [2, 21] 将是 9699690 - 几乎 1000 万。因此,在得出理论上可能的最小答案之前,您需要计算大约 2 亿次模运算。
  • 一种更快的方法是迭代计算最小倍数,借助当前倍数和新元素之间的gcd。甚至可能存在更快的方法
  • “更快”是一种轻描淡写的说法。当前的算法接近阶乘时间复杂度,而您的建议基本上是线性的,以及对数的欧几里得算法。所以我们说的是O(N.logN) 而不是O(N!)

标签: python algorithm computation


【解决方案1】:

问题是这是一个非常低效的算法。更好的方法是(使用 OP 的变量名):

def lowest_common_multiple(a, b):
    # This would be replaced by the real code;
    # OP can search for an algorithm or implementation
    return a * b

multiples = range(2,21)
start = 1
for i in multiples:
    start = lowest_common_multiple(start, i)
print(start)

这里有一个StackOverflow post on the LCM algorithm 可以帮助您入门。

注意,Python 3.9 和 NumPy 都提供 LCM 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2015-10-12
    • 2015-01-06
    • 2022-09-29
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多