📜  最小公倍数算法 (1)

📅  最后修改于: 2023-12-03 15:26:26.476000             🧑  作者: Mango

最小公倍数算法

最小公倍数(Least Common Multiple,简称 LCM)是指在两个或多个整数中同时能被整除的最小正整数。

暴力枚举法

最简单直接的方法是通过枚举法计算两个数的最小公倍数。枚举法的原理是从两个整数中较大的数开始,如果两个数中的较大数不能同时被两个数的较小数整除,则继续加上较大数,直到找到可以同时被两个数整除的数为止。该算法的时间复杂度为 $O(N)$,其中 $N$ 是两个整数中较大的数。

def lcm(a, b):
    if a > b:
        greater = a
    else:
        greater = b
    while True:
        if greater % a == 0 and greater % b == 0:
            lcm = greater
            break
        greater += 1
    return lcm

代码中,我们先判断哪个数比较大,然后不停地试探比较大的数增加自己是否能够同时被两个整数整除。

辗转相除法

辗转相除法又叫欧几里得算法,它的基本原理是通过反复用较小数去除较大数的余数,直到余数为零为止。该算法的时间复杂度取决于较小的那个整数的位数。

def gcd(a, b):
    if b == 0:
        return a
    else:
        return gcd(b, a % b)

def lcm(a, b):
    return a * b // gcd(a, b)

通过辗转相除法,我们先求出两个数的最大公约数(Greatest Common Divisor,简称 GCD),然后两个数的最小公倍数就是它们的乘积除以最大公约数。

质因数分解法

质因数分解法将两个数分别进行质因数分解,然后用其中的每个质数的最大次数的乘积组成两个数的最小公倍数。该算法的时间复杂度取决于两个数分别进行质因数分解所需要的时间,一般情况下是很快的。

def prime_factors(n):
    i = 2
    factors = []
    while i * i <= n:
        if n % i:
            i += 1
        else:
            n //= i
            factors.append(i)
    if n > 1:
        factors.append(n)
    return factors

def lcm(a, b):
    factors_a = prime_factors(a)
    factors_b = prime_factors(b)
    lcm = 1
    all_factors = list(set(factors_a+factors_b))
    for factor in all_factors:
        lcm *= factor ** max(factors_a.count(factor), factors_b.count(factor))
    return lcm

通过质因数分解,我们先把两个数分别进行质因数分解,然后考虑每个质数在两个数中出现的最大次数,它们的乘积就是两个数的最小公倍数。