📜  N个数的常见除数(1)

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

N个数的常见除数

在编程中,我们常常需要找到多个整数的共同因数或除数。本文将介绍常见的求取N个数的公共因数或公共除数的方法。

方法一:暴力枚举法

暴力枚举法是最简单的方法,其基本思想是通过循环找到N个数的最小值min,然后从1到min枚举每个数i,如果每个数都能被i整除,则将i加入结果集中。

def common_divisor(nums):
    res = []
    min_val = min(nums)
    for i in range(1, min_val+1):
        if all(num%i == 0 for num in nums):
            res.append(i)
    return res

该方法的时间复杂度为O(NM),其中N为数组长度,M为数组中最小值。

方法二:辗转相除法

辗转相除法也称为欧几里得算法,其基本思想是用较大的数除以较小的数,再用余数去除除数,如此反复,直到余数为0为止。最后一个非0数就是N个数的最大公约数。

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

def common_divisor(nums):
    res = []
    gcd_val = nums[0]
    for i in range(1, len(nums)):
        gcd_val = gcd(gcd_val, nums[i])
    for i in range(1, int(gcd_val**0.5)+1):
        if gcd_val%i == 0:
            res.append(i)
            if i != gcd_val//i:
                res.append(gcd_val//i)
    return res

该方法的时间复杂度为O(NlogM),其中N为数组长度,M为数组中最大值。

方法三:质因数分解法

质因数分解法是将数分解成一系列质数的乘积,再找到N个数中所有质因数的交集即为N个数的公共因数或公共除数。

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

def common_divisor(nums):
    res = []
    factors = prime_factors(nums[0])
    for i in range(1, len(nums)):
        f = prime_factors(nums[i])
        factors = list(set(factors) & set(f))
    for factor in factors:
        res.append(factor)
    return res

该方法的时间复杂度为O(NMlogM),其中N为数组长度,M为数组中最大值的质因数个数。虽然时间复杂度较高,但当N较大时,该方法比暴力枚举法和辗转相除法更加高效。

以上三种方法分别是暴力枚举法、辗转相除法和质因数分解法,可以根据实际需求选择合适的方法。