欧几里德算法又称辗转相除法,用于计算两个整数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))