📅  最后修改于: 2023-12-03 15:03:20.162000             🧑  作者: Mango
在编程中,我们常常需要找到多个整数的共同因数或除数。本文将介绍常见的求取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较大时,该方法比暴力枚举法和辗转相除法更加高效。
以上三种方法分别是暴力枚举法、辗转相除法和质因数分解法,可以根据实际需求选择合适的方法。