Mil*_*lky 5 python loops while-loop
在本练习中,我需要想出一种方法来找到前 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)
Run Code Online (Sandbox Code Playgroud)
是否有更有效的编码方法,而无需为循环中要考虑的每个潜在数字编写条件?
下面是一个较短的版本,取代长or
有any
if excercise == 34:
lcm = 20
while any(lcm % i != 0 for i in range(2, 21)):
lcm += 1
print(lcm)
Run Code Online (Sandbox Code Playgroud)
我想说最好的方法是这样的:
>>> math.lcm(*range(1, 21))
232792560
Run Code Online (Sandbox Code Playgroud)
由于结果相当大,+= 1
无论其他人做得多么好,您的循环都会花费很长时间。
Python 3.9 之前的最佳方式可能是这样的:
>>> def lcm(a, b):
return a * b // math.gcd(a, b)
>>> functools.reduce(lcm, range(1, 21))
232792560
Run Code Online (Sandbox Code Playgroud)
两种方式都只需要几微秒。
或者...稍加努力,您可以将该范围内所有素数的最大幂相乘:
>>> 16*9*5*7*11*13*17*19
232792560
Run Code Online (Sandbox Code Playgroud)