📜  打印两个数字的第k个公因子(1)

📅  最后修改于: 2023-12-03 15:10:01.384000             🧑  作者: Mango

打印两个数字的第k个公因子

有时候我们需要找出两个数字的公因子,更进一步的我们也需要知道这些公因子的顺序。本文将介绍找出两个数字的第$k$个公因子的算法。

算法流程

我们可以先把两个数字的所有公因子都求出来,然后再按从小到大的顺序输出第$k$个。具体算法流程如下:

  1. 枚举从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)
    
  2. 对列表中的元素从小到大排序。

    factors = sorted(factors)
    
  3. 输出第$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)$。