1、普通写法
/**
* 普通写法
* @param numbera
* @param numberb
* @return
*/
public static int gcd(int numbera, int numberb){
int max = numbera >= numberb ? numbera : numberb;
int min = numbera < numberb ? numbera : numberb;
if(max%min == 0){
return min;
}
int gcd = 1;
for(int i=2; i
if(numbera%i==0 && numberb%i ==0){
gcd = i;
}
}
return gcd;
}
缺点:效率低
2、辗转相除法
/**
* 辗转相除法
* @param numbera
* @param numberb
* @return
*/
public static int EuclideanAlgorithm(int numbera, int numberb){
if(numbera == numberb){
return numbera;
}
if(numbera < numberb){
return ea(numberb,numbera);
}else{
return ea(numbera,numberb);
}
}
private static int ea(int numbera, int numberb) {
if(numbera%numberb == 0){
return numberb;
}
return EuclideanAlgorithm(numberb,numbera%numberb);
}
缺点:求模运算效率低
3、更相减损术
/**简化版
* 更相减陨术
* @param numbera
* @param numberb
* @return
*/
public static int gcdChina(int numbera , int numberb){
if(numbera == numberb){
return numbera;
}
if(numbera > numberb){
return gcdChina(numbera-numberb,numberb);
}else{
return gcdChina(numberb-numbera,numbera);
}
}
缺点:(简化版的更相减损术)减法运算较之求模运算运算次数过多
4、
/**
* 位运算,更想减陨术结合
* @return
*/
public static int gcdEaAndChina(int numbera,int numberb){
if(numbera == numberb) {
return numbera;
}
if(numbera < numberb){
return gcdEaAndChina(numberb,numbera);
}else{
int x = numbera & 1;
int y = numberb & 1;
if(x==0 && y==0){
return gcdEaAndChina(numbera>>1,numberb>>1) << 1;
}else if(x==1 && y==0){
return gcdEaAndChina(numbera,numberb>>1);
}else if(x==0 && y==1){
return gcdEaAndChina(numbera>>1,numberb);
}else{
return gcdEaAndChina(numberb,numbera-numberb);
}
}
}
确保 a>b 减少代码量
偶数时,减半运算 然后恢复 奇数时,用更相减损术 。使用位运算加快效率