求最大公约数--欧几里德算法 及 最小公倍数

最大公约数

欧几里德算法

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:

 gcd(a, b) = gcd(b, a mod b)

其中gcd(a, b)表示a和b的最大公约数, mod是模运算, 即求a除以b的余数. 

计算机实现思路:

例如求10和7的最大公约数,那么gcd(10,7)=gcd(7,3)=gcd(3,1),此时一眼看出最大公约数必然是1。
那我们就算到这里吗?
在举个例子,gcd(10,6)=gcd(6,4)=gcd(4,2) 此时我们也是一眼看出最大公约数是2。
那么我们怎么能找到这两个例子的共通之处呢?
很明显,共通之处即在于最后收敛的两个数,后者必定整除前者,也就是说我们只需要判断,当后者整除前者时,我们即可得到答案。
于是我们考虑如何让计算机实现。实现中会发现,要想实现上述思路,我们必须每一步都去判断前者是否会被后者整除,但是这样程序的效率不高,每次都要做一次整除和判断运算。所以这还不是最好的结果。

但是我们发现其实上述两个例子还是可以继续收敛的。即gcd(3,1)=gcd(1,0), gcd(4,2)=gcd(2,0),也就是说当后者为0时,前者就是我们要找的最大公约数,而且计算机只需要判断后者是否为0即可,效率高。

于是答案找到。

代码实现

python代码实现:

def gcd(m, n):
    while n:
        temp = m
        m = n
        n = temp % n
    return m

递归实现

def gcd(m, n):
    if n == 0:
        return m
    return gcd(n,m%n)

最小公倍数

最小公倍数=两数的乘积/最大公约(因)数

def gcd(m, n):
    if n == 0:
        return m
    return gcd(n,m%n)

def lcm(m,n):
    return m*n/gcd(m,n)
    
print(lcm(10,6))


你可能感兴趣的:(求最大公约数--欧几里德算法 及 最小公倍数)