编程题,输入两个正整数,求其最大的公约数和最小公倍数。例如,m=14,n=6,最大公 约数为2,最小公倍数为5
时间: 2023-05-31 07:04:26 浏览: 91
方法一:暴力枚举法
首先,我们可以从小到大枚举两个正整数中较小的那个数的所有因子,然后判断这些因子是否同时也是另一个数的因子,最后找到最大的同时是两个数的因子的数即为它们的最大公约数,最小公倍数则可以通过两个数的乘积除以它们的最大公约数得到。
时间复杂度:O(min(m,n))
代码如下:
```python
def gcd_lcm(m, n):
if m > n:
m, n = n, m
gcd = 1
for i in range(1, m+1):
if m % i == 0 and n % i == 0:
gcd = i
lcm = m * n // gcd
return gcd, lcm
```
方法二:辗转相除法
辗转相除法,也叫欧几里德算法,用于计算两个数的最大公约数。其基本思想是:用大数除以小数,然后用小数除以余数,再用余数除以上一步的余数,直到余数为0,此时最后一步的除数即为两个数的最大公约数。
根据最大公约数和最小公倍数的定义,我们可以推导出如下公式:
最大公约数:gcd(m,n) = gcd(n,m mod n)
最小公倍数:lcm(m,n) = m * n / gcd(m,n)
时间复杂度:O(log(min(m, n)))
代码如下:
```python
def gcd_lcm(m, n):
if m < n:
m, n = n, m
while n != 0:
m, n = n, m % n
gcd = m
lcm = m * (m // gcd) * (n // gcd)
return gcd, lcm
```
方法三:递归实现辗转相除法
上面的迭代实现方法也可以通过递归来实现:
时间复杂度:O(log(min(m, n)))
代码如下:
```python
def gcd_lcm(m, n):
if m < n:
m, n = n, m
if n == 0:
return m, m
else:
gcd, lcm = gcd_lcm(n, m % n)
return gcd, m * n // gcd
```
阅读全文