所以我是一名新的程序员,在大学学习CS。我是Python的新手并且一直在解决项目的euler难题,我想知道为什么我的5号需要这么长时间来计算!看起来像287秒。我得到了正确答案,但计算时间很长。任何人都可以向我解释为什么会这样,以及如何更好地优化它以更快地运行?
对于不熟悉项目euler的人,这个问题要求我找到所有数字1到20可以整除的第一个正数。
编辑:感谢所有帮助人员。我不知道如何对评论发表评论,但您的建议非常有用。谢谢!
import time
def main():
time_start = time.clock()
x=2
while True:
if divBy20(x)==True:
print(x)
break
else:
x=x+1
time_elapsed = (time.clock() - time_start)
print(time_elapsed)
def divBy20(a):
for i in range(1,21):
if a%i!=0:
return False
return True
main()
答案 0 :(得分:3)
你的程序逐个遍历每个可能的数字,直到找到解决方案。这是蛮力解决方案。项目欧拉问题旨在挫败蛮力方法。它需要聪明才能改进直接方法。有时这意味着改进你的答案。有时它意味着完全重新思考它。
这个问题就是一个很好的例子。您可以对算法进行一些渐进式改进。例如,你知道答案必须是均匀的,那么为什么不跳过奇数?
x = x + 2
事实上,它必须可以被3整除,所以我们甚至可以计算为6的倍数。
x = x + 6
它必须可被5整除,对吗?哎呀,让我们一次数30。现在我们正在做饭!
x = x + 30
你可以继续遵循这一思路,使增量越来越大。但这将是退一步的好时机。让我们重新思考整个方法。我们需要迭代吗?这一切都在哪里?
如果我们将1×2×3×4×5 ......×19×20相乘,我们就有 a 数,可以被1到20整除。但它不会是最小这样的数字。
为什么?嗯,它太大的原因是因为数字之间的重叠。如果我们要乘以4,我们不必乘以2.如果我们要乘以6,我们不必乘以3。
突破是只增加素数因子。我们不需要6,因为我们已经有2和3.如果我们乘以2,我们不需要9。
问题是,我们需要多少个主要因素?多少2?多少3?答案:我们需要足够的数量来覆盖20个数字。我们需要最多4个2,因为16 = 2 4 。我们不需要五个,因为没有数字有五个2。我们需要两个3来处理9和18.而且我们只需要5,7,11,13,17和19中的一个 - 没有数字不止一次。
有了这个,我们可以手工计算答案。我们甚至不需要一个程序!
2 4 ×3 2 ×5×7×11×13×17×19 = 232,792,560
答案 1 :(得分:1)
Project Euler#5,
考虑到主要因素:
1 = 1
2 = 2
3 = 3
4 = 2^2
5 = 5
6 = 2 * 3
7 = 7
8 = 2^3
9 = 3^3
10 = 2 * 5
11 = 11
12 = 2^2 * 3
13 = 13
14 = 2 * 7
15 = 3 * 5
16 = 2^4
17 = 17
18 = 2 * 3^2
19 = 19
20 = 2^2 * 5
那么这个问题确实存在: 产品((一个主要因素)**(这个公因子的最大倍数),所有常见因素)
lcm(1,2,3,4,5,6,7,8,9,10) = 2^13 * 3^2 * 5^1 * 7^1 = 2520
lcm(1,...,20) = 2^4 * 3^2 * 5 * 7 * 11 * 13 * 17 * 19
顺便说一下,你似乎不是第一个陷入暴力陷阱的人:Project Euler 5 in Python - How can I optimize my solution?
现在弄清楚如何在代码中执行此操作。
答案 2 :(得分:0)
您可以采取明显的措施加快速度,例如:
ETS。
但更好的方法是考虑所有可能的解决方案都是您的部分或全部因素的产物 - 所以您可以检查3-19个因素的可能产品,保持符合要求然后返回最低要求的那些。您可以进一步删除较高因素中存在的那些因素,例如: 2,4和4 5已经在20,3在9等