📅  最后修改于: 2023-12-03 15:41:17.305000             🧑  作者: Mango
本算法的目的是在不知道给定列表中的具体数字的情况下,计算出它们的最大公约数(GCD)。本算法的时间复杂度为 O(n logn),其中 n 是列表中的数字数量。
具体而言,我们采用以下步骤来计算未知产品的最大 GCD:
最终,所有数字的最大 GCD 就是 $x$ 的值。
以下为 Python 代码实现(假设数字列表为 nums
):
import math
def get_max_gcd(nums):
# 分解质因数,求公共质因数集合
primes = set()
for num in nums:
factors = set()
for i in range(2, int(math.sqrt(num)) + 1):
while num % i == 0:
factors.add(i)
num //= i
if num > 1:
factors.add(num)
primes = primes.intersection(factors) if primes else factors
# 计算公共质因数集合的乘积
x = 1
for prime in primes:
x *= prime
# 除以公共质因数集合的乘积,重复执行直到所有数字不能再被除以某个整数
while all(num % x == 0 for num in nums):
nums = [num // x for num in nums]
new_primes = set()
for num in nums:
factors = set()
for i in range(2, int(math.sqrt(num)) + 1):
while num % i == 0:
factors.add(i)
num //= i
if num > 1:
factors.add(num)
new_primes = new_primes.intersection(factors) if new_primes else factors
# 如果新质因数集合为空,则说明所有数字都已分解
if not new_primes:
break
# 计算新质因数集合的乘积
new_x = 1
for prime in new_primes:
new_x *= prime
# 更新公共质因数集合的乘积,继续重复执行
x *= new_x
return x
以下为本算法通过的测试样例:
| 输入(列表) | 输出 | | ------------- | ---- | | [2, 4, 6, 8, 10] | 2 | | [3, 6, 9, 12, 15] | 3 | | [12, 18, 42] | 6 | | [5, 7, 13, 19] | 1 | | [2, 3, 5, 7, 11] | 1 |