📅  最后修改于: 2023-12-03 15:41:16.379000             🧑  作者: Mango
最大公约数(GCD)是指两个或多个整数共有约数中最大的那一个,用于计算给定整数的公共因数。
本篇介绍给定乘积的 N 个整数的最大 GCD,即给定 N 个数的乘积,求这 N 个数的最大公约数。
首先将乘积因数分解,得到每个因子的次数。
然后我们可以注意到:对于一个给定的因数,它在所有 N 个数的最大公约数中的次数,就是这个因数在 N 个数因子分解后次数的最小值。
因此,我们可以通过扫描所有给定数的因子次数,得到它们每个因子在所有给定数的最大公约数中的次数,并计算它们的 GCD,即为最大 GCD。
该算法的时间复杂度为 O(nlogn),其中 n 为所有因子的数量。在实际应用中,若给定数的范围较小,可使用线性筛及欧拉定理进行优化,时间复杂度降至 O(NlogN)。
以下是 Python 语言的示例代码:
def gcd(nums):
"""
计算给定整数的最大公约数
"""
def factorize(num):
"""
将一个数进行因数分解,返回因子及其次数的字典
"""
factors = {}
for i in range(2, int(num ** 0.5) + 1):
while num % i == 0:
factors[i] = factors.get(i, 0) + 1
num //= i
if num > 1:
factors[num] = factors.get(num, 0) + 1
return factors
factor_counts = {}
for num in nums:
factors = factorize(num)
for factor, count in factors.items():
factor_counts[factor] = factor_counts.get(factor, []) + [count]
max_gcd = 1
for factor, counts in factor_counts.items():
if len(counts) == len(nums):
max_gcd *= factor ** min(counts)
return max_gcd
nums = [2, 6, 14, 28]
print(gcd(nums)) # 输出: 2
该代码将会输出 2
,即给定数 [2, 6, 14, 28]
的最大公约数。