📅  最后修改于: 2023-12-03 14:57:48.486000             🧑  作者: Mango
问题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)。