import time
start = time.time()
result = 0
done = False
while not done:
result += 20
for x in [20, 19, 18, 17, 16, 15, 14, 13, 11]:
if result % x != 0:
break
else:
done = True
end = time.time()
print('result:', result)
print('time in seconds:', end-start)
你要找的是数字1到20中的“最小公倍数”,或LCM。这是这些数的多组素数因子的并集。例如,12和15的LCM是多集{2,2,3}和{3,5}的并集,即{2,2,3,5},或60。在
如果有一个GCD函数(“最大公约数”),那么可以利用LCM(x,y)=x*y//GCD(x,y)这一事实。然后,您可以通过从1开始依次添加每个数字的唯一因子来累积LCM。在
如果您使用的是python3,那么可以从
math.gcd
获得GCD。例如,以下将给出1到10的答案:这将按预期给出
^{pr2}$2520
。对于1到20,只需:这给出
232792560
。在这两种计算基本上都是瞬时的。在
更新:实际上,您可以通过将循环体替换为:
这是因为
i
是math.gcd(r, i)
的倍数。通过先除后乘,计算中涉及的数字要小一些。在因为它必须被
20
除,所以你只能检查20
的倍数,这样你就可以检查更少的数字。在如果数字被
20
除,那么它必须被2
,10
(20=2*10
),4
,5
(20=4*5
),这样你就不必检查2
,4
,5
,10
。同样的方法你可以消除其他数字。在最后我得到了列表
20
,19
,18
,17
,16
,15
,14
,13
,11
结果:
^{pr2}$相关问题 更多 >
编程相关推荐