一、介绍
二进制最大公约数算法避免了欧几里得算法(辗转相除法)的大量取模操作,有效减少了时间消耗,且更为方便。
二、原理
本算法基于以下事实:
对于两个数的最大公约数gcd(m, n),有
- m<n时,gcd(m, n)=gcd(n, m)
- m偶n偶时,gcd(m, n)=2*gcd(m/2, n/2)
- m偶n奇时,gcd(m, n)=gcd(m/2, n)
- m奇n偶时,gcd(m, n)=gcd(m, n/2)
- m奇n奇时,gcd(m, n)=gcd(n, m-n)
采用递归即可。
三、实现
int gcd(int m, int n) {
if(m == n) return m;
if(m < n) return gcd(n, m);
if(m & 0x01 == 0