📜  资质|算术能力2 |问题8(1)

📅  最后修改于: 2023-12-03 14:57:48.486000             🧑  作者: Mango

资质 | 算术能力 2 | 问题8
问题描述

问题8要求实现一个函数,输入两个整数 num1 和 num2,求它们的最大公约数(GCD)和最小公倍数(LCM)。

输入

函数的输入为两个整数 num1 和 num2 (-2^31 <= num1, num2 <= 2^31 - 1)。

输出

函数应该返回一个长度为2的整数列表,分别表示 num1 和 num2 的最大公约数和最小公倍数。

示例

输入:num1 = 12, num2 = 18

输出:[6, 36]

解题思路

要求最大公约数和最小公倍数,可以利用欧几里得算法求解。首先求解最大公约数,可以使用辗转相除法或辗转相减法,递归求解直到一个数为0,另一个数即为最大公约数。最小公倍数可以通过最大公约数与两数乘积的除法得到。

代码实现

你可以使用以下代码实现这个问题:

def gcd_and_lcm(num1, num2):
    def gcd(a, b):
        if b == 0:
            return a
        return gcd(b, a % b)

    if num1 < num2:
        num1, num2 = num2, num1
    
    greatest_common_divisor = gcd(num1, num2)
    least_common_multiple = (num1 * num2) // greatest_common_divisor

    return [greatest_common_divisor, least_common_multiple]
复杂度分析

该算法的时间复杂度为 O(log(min(num1, num2))),空间复杂度为 O(1)。

注意事项
  • 输入的整数 num1 和 num2 的范围为 -2^31 到 2^31 - 1。
  • 函数的返回值为一个整数列表。
  • 需要注意处理输入数的顺序,确保 num1 大于等于 num2。