📅  最后修改于: 2023-12-03 15:10:01.384000             🧑  作者: Mango
有时候我们需要找出两个数字的公因子,更进一步的我们也需要知道这些公因子的顺序。本文将介绍找出两个数字的第$k$个公因子的算法。
我们可以先把两个数字的所有公因子都求出来,然后再按从小到大的顺序输出第$k$个。具体算法流程如下:
枚举从1到两个数中较小的那个数的所有数$i$,如果$i$能同时被两个数字整除,即$i$是两个数字的公因子,将其加入到一个列表中。
factors = []
for i in range(1, min(a, b)+1):
if a % i == 0 and b % i == 0:
factors.append(i)
对列表中的元素从小到大排序。
factors = sorted(factors)
输出第$k$个元素。注意这里的$k$是从1开始的,所以需要将$k-1$作为列表的下标。
if k <= len(factors):
return factors[k-1]
else:
return -1
下面是完整的Python代码:
def kth_factor(a, b, k):
factors = []
for i in range(1, min(a, b)+1):
if a % i == 0 and b % i == 0:
factors.append(i)
factors = sorted(factors)
if k <= len(factors):
return factors[k-1]
else:
return -1
我们还需要编写一些测试代码来验证算法的正确性。
assert kth_factor(10, 20, 1) == 1
assert kth_factor(10, 20, 2) == 2
assert kth_factor(10, 20, 3) == 5
assert kth_factor(10, 20, 4) == 10
assert kth_factor(10, 20, 5) == -1
测试代码的含义是分别测试10和20的第1/2/3/4/5个公因子是否分别为1/2/5/10/-1。
本文介绍了如何找出两个数字的第$k$个公因子。该算法时间复杂度为$O(nlogn)$,其中$n$为两个数字的较小值。如果需要多次查询第$k$个公因子,可以考虑预处理出所有公因子的列表再查询,时间复杂度为$O(n)$。