📅  最后修改于: 2023-12-03 15:10:44.913000             🧑  作者: Mango
在计算机科学中,最小公倍数(LCM)和最大公约数(GCD)是基本的算法和数学概念。在这个问题中,我们需要查找一个数组中所有不同对的 LCM 的 GCD 。
我们可以遍历所有可能的数组对并计算它们的 LCM,然后再对这些 LCM 的集合计算 GCD。然而,这种算法的时间复杂度为 O(n^3),适合较小的数组。
在更大的数组中,我们可以使用另一种算法:
这种算法的时间复杂度为 O(n log n),适用于大型数组。
以下是使用 Python 实现以上算法的代码片段:
from collections import defaultdict
import math
def calculate_lcm(nums):
primes = defaultdict(int)
for num in nums:
for i in range(2, int(math.sqrt(num))+1):
cnt = 0
while num % i == 0:
cnt += 1
num //= i
primes[i] = max(primes[i], cnt)
if num > 1:
primes[num] = max(primes[num], 1)
lcm = 1
for prime, freq in primes.items():
lcm *= prime ** freq
return lcm
def find_unique_pairs_gcd(nums):
lcm_set = set()
for i in range(len(nums)):
for j in range(i+1, len(nums)):
lcm_set.add(calculate_lcm([nums[i], nums[j]]))
lcm_list = list(lcm_set)
gcd = lcm_list[0]
for lcm in lcm_list[1:]:
gcd = math.gcd(gcd, lcm)
return gcd
# example usage
nums = [2, 4, 6, 8]
print(find_unique_pairs_gcd(nums)) # output: 2
以上代码中,calculate_lcm
函数计算一个数字列表的 LCM,find_unique_pairs_gcd
函数遍历数组并计算所有唯一对的 LCM,最后计算所有 LCM 的 GCD。