返回范围内一组数字的所有最小公倍数



我想创建一个函数,通过使用列表压缩生成一个从1到300的所有数字的列表,这些数字可以被6和10整除。预期输出如下:

ist_result = special_nums()
list_result
[30, 60, 90, 120, 150, 180, 210, 240, 270, 300]

我想我可能不得不在某种程度上使用范围函数,但我不确定。有什么想法吗?

从这里定义一个函数来计算2个或多个数字的素数:

def gcd(a, b):
"""Return greatest common divisor using Euclid's Algorithm."""
while b:      
a, b = b, a % b
return a
def lcm(a, b):
"""Return lowest common multiple."""
return a * b // gcd(a, b)
def lcmm(*args):
"""Return lcm of args."""   
return reduce(lcm, args)

接下来,计算数字的lcm,然后迭代地发射数字。好的是,如果你知道lcm,你就不必复习这个范围内的每一个数字。

from math import ceil
def get_multiples(start, end, *args):
lcm = lcmm(*args)
start = max(lcm, lcm * ceil(start / lcm))  # max(..., ...) in case start < lcm
for i in range(start, end + 1, lcm):
yield i

>>> list(get_multiples(1, 300, 6, 10))
[30, 60, 90, 120, 150, 180, 210, 240, 270, 300]

如上所述,这是有效的,因为它不会迭代所提供范围内的每个值,并且可以有效地扩展到>2个值:

>>> list(get_multiples(79, 400, 6, 10, 20))
[120, 180, 240, 300, 360]

以下表达式将起作用(因为30是6和10的最低公分母(:

[n for n in range(1, 301) if n % 30 == 0]

最新更新