问题描述
在本练习中,我需要想出一种方法来找到前20个自然数(1-20)的最小公倍数(LCM)。 到目前为止,这就是我得到的:
if exercise == 34:
lcm = 20
while lcm % 2 != 0 or \
lcm % 3 != 0 or \
lcm % 4 != 0 or \
lcm % 5 != 0 or \
lcm % 6 != 0 or \
lcm % 7 != 0 or \
lcm % 8 != 0 or \
lcm % 9 != 0 or \
lcm % 10 != 0 or \
lcm % 11 != 0 or \
lcm % 12 != 0 or \
lcm % 13 != 0 or \
lcm % 14 != 0 or \
lcm % 15 != 0 or \
lcm % 16 != 0 or \
lcm % 17 != 0 or \
lcm % 18 != 0 or \
lcm % 19 != 0 or \
lcm % 20 != 0:
lcm += 1
print(lcm)
是否有效率更高的编码方式而无需为循环中要考虑的每个潜在数写条件?
解决方法
这是一个较短的版本,将长or
替换为any
if excercise == 34:
lcm = 20
while any(lcm % i != 0 for i in range(2,21)):
lcm += 1
print(lcm)
,
我会will be这样说:
>>> math.lcm(*range(1,21))
232792560
由于结果很大,因此不管其他人做多好,您的+= 1
循环都将花费很长时间。
Python 3.9之前的最佳方式可能是这样的:
>>> def lcm(a,b):
return a * b // math.gcd(a,b)
>>> functools.reduce(lcm,range(1,21))
232792560
两种方法仅需几微秒。
或者...只要花些力气,就可以乘以该范围内所有素数的最大幂:
>>> 16*9*5*7*11*13*17*19
232792560