【发布时间】: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