直接上代码
//java
public long gcd(long m, long n){
while (n != 0){
long rem = m % n;
m = n;
n = rem;
}
return m;
}
欧几里得算法分析:
设 m = 115,n = 15
[n(15) != 0] = true
rem(10) = m(115) % n(15)
m = n(15)
n = rem(10)
[n(10) != 0] = true
rem(5) = m(15) % n(10)
m = n(10)
n = rem(5)
[n(5) != 0] = true
rem(0) = m(10) % n(5)
m = n(5)
n = rem(0)
[n(0) != 0] = false
return m(5)
代码总共迭代了三次
流程图
算法运行时间简单分析
定理 m % n < n
证明 m % n < m/2
分两种情况:
1. 当 n <= m/2 时,因为 m % n < n ,又 n <= m/2,所以 m % n < m/2
2.当 n > m/2 时,因为 m % n = m - n;又 m - n < m - m/2,所以 m % n < m/2
while
循环体里面迭代两次 m % n
最多是原始值得一半,即
2logN=O(logN)
,从而得到运行时间,理想情况迭代次数为
logN
。