【发布时间】:2020-09-20 01:36:35
【问题描述】:
我正在经历 euler 项目,和很多人一样,我被困在效率上。我不介意尝试将时间从 7 毫秒减少到 6 毫秒,但我确实关心我的循环必须等待半小时。 问题是:
能被 1 到 20 的所有数整除的最小正数是多少?
我认为我在 python 中有一个有效的解决方案,但它的效率非常低。
import sys
import math
def multiple():
multiple = 20
multiples = []
while multiple < math.sqrt(sys.maxsize):
div_flag = False
max_flag = False
for i in range(2, 21):
if multiple % i == 0:
div_flag = True
if i == 20:
max_flag = True
else:
max_flag = False
if multiple % i != 0:
div_flag = False
break
if max_flag == True:
multiples.append(multiple)
multiple = math.sqrt(sys.maxsize)
multiple += 20
print(multiple, "div_flag: " + str(div_flag), "max_flag: " + str(max_flag), str(multiples))
# These prints are just there for debugging.
print(multiples)
multiple()
如您所见,它遍历每个数字,直到最大安全整数的 sqrt()。 sqrt() 的原因是因为我试图让它更有效率,但无论如何它从来没有达到那一点。我让它运行了大约 15 分钟,它达到了大约 200 万(这是当变量 multiples 为 2 并增加 1 时)。然后,我尝试将multiple 变量增加 20(如上所示),在 15 分钟多一点的时间里,我有 4500 万。我在做欧拉项目的时候看了一下答案,大概是2亿左右。我没有作弊,我只是确保我的程序有问题并且它没有跳过那个目标数字。是什么让我可以在一分钟内得到答案,我说。正如我所说,我不是效率狂,我只想在一分钟内看到结果。
我对 python 还很陌生,所以我知道有一些非常明显的答案。
附: 我不希望直接重写我的代码,所以也许这里和那里的一些示例代码,一些提示会很好。(所以我实际上学习并改进了我的编码。) p>
【问题讨论】:
-
在实践中,您只需对每个数进行质数分解,并保持每个质数的最大指数
标签: python algorithm performance math