python实现辗转相除法求最大公约数和最小公倍数

辗转相除法数学原理

辗转相除法也称欧几里得算法,是用来求两个正整数的最大公约数的算法。接下来我们用实例来解释一下。假如我们需要求12和21的最大公约数,用辗转相除法是这样实现的:
21 / 12 = 1 (余 9)
12 / 9 = 1(余 3
9 / 3 = 3 (余 0)
至此,得到21与12的最大公约数为3(注意:这里的3是第二个式子取余得到的3,而非最后一个式子相除得到的),然后把两个数相乘再除以最大公约数就可以得到最小公倍数:(21*12)/ 3 = 84

python代码实现

接下来我们用python代码来实现这样一道题目:

	题目:输入两个正整数,求其最大公约数和最小公倍数。
def func(m,n):
    a = m
    b = n
    # 默认m>n,若不是,则交换
    if m < n:
        m,n = n,m
    while n != 0:
        # 对m除n取余
        r = m % n
        m = n
        n = r
    return m,(a*b)/m

print("正整数m与n的最大公约数与最小公倍数分别为:",func(12,21))
正整数m与n的最大公约数与最小公倍数分别为: (3, 84.0)

用递归的方式实现

def rec(m,n):
    # 默认m>n,若不是,则交换
    if m < n:
        m,n = n,m
    # 终止条件    
    if n == 0:
        return m,(a*b)/m
    # 递归部分
    return rec(n,m%n)

a = 12
b = 21
print("正整数m与n的最大公约数与最小公倍数分别为:",rec(12,21))
正整数m与n的最大公约数与最小公倍数分别为: (3, 84.0)

你可能感兴趣的:(数据结构与算法,算法,python)