**
算法学习笔记
**
//求两个整数的最大公约数
public class GreatestCommonDivisor {
//求最大公约数方法theGCD(a,b);利用递归调用
//结合了 辗转相除法 和 更相减损术 的各自的优势,同时利用了 移位 运算(a>>1-->a后移1位,即除以2 a<<1-->a前移1位,即乘以2)
//还用到了 按位 与 (&)运算,例如 a&b : a和b先转为 补码,然后再 按位 进行 与(&)运算。 a&1==0,说明a为偶数, a&1!=0,说明a为奇数。
public static int theGCD(int a, int b) {
if(a==b) {
return a;
}
//a,b全为偶数
if((a&1)==0 && (b&1)==0) {
return theGCD(a>>1, b>>1)<<1;
}
//a为奇数,b为偶数
else if((a&1)!=0 && (b&1)==0) {
return theGCD(a, b>>1);
}
//a为偶数,b为奇数
else if((a&1)==0 && (b&1)!=0) {
return theGCD(a>>1, b);
}
//a,b全为奇数
else {
int big=a>b?a:b;
int small=a<b?a:b;
return theGCD(big-small,small);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
GreatestCommonDivisor gcd=new GreatestCommonDivisor();
System.out.println(gcd.theGCD(25, 80));
System.out.println(gcd.theGCD(348, 60));
System.out.println(gcd.theGCD(240, 40));
System.out.println(gcd.theGCD(100, 80));
}
}