Python程序:查找不同子序列的最大公约数
假设我们有一个包含正数的数组 nums。我们需要找到 nums 所有非空子序列中不同最大公约数的数量。众所周知,一个数字序列的最大公约数是指能整除该序列中所有数字的最大值。
例如,如果输入为 nums = [4,6,18],则输出将为 4,因为 gcd([4]) = 4,gcd([6]) = 6,gcd([18]) = 18,gcd([4,6]) = 2,gcd([4,18]) = 2,gcd([6,18]) = 6,gcd([4,6,18]) = 2,所以所有数字为 [4,6,18,2],共有 4 个数字。
为了解决这个问题,我们将遵循以下步骤:
T := nums 中最大值的加 1
nums := 包含 nums 所有不同数字的新集合
ans := 0
对于 x 从 1 到 T - 1,执行以下操作:
g := 0
对于 y 从 x 到 T - 1,每次递增 x,执行以下操作:
如果 y 在 nums 中,则
g := gcd(g, y)
如果 g 等于 x,则
退出循环
如果 g 等于 x,则
ans := ans + 1
返回 ans
示例
让我们看看下面的实现以更好地理解
from math import gcd def solve(nums): T = max(nums) + 1 nums = set(nums) ans = 0 for x in range(1, T): g = 0 for y in range(x, T, x): if y in nums: g = gcd(g, y) if g == x: break if g == x: ans += 1 return ans nums = [4,6,18] print(solve(nums))
输入
[4,6,18]
输出
4
广告