之前求最大公约数只知道最经典的辗转相除法:
private static int gcd_1(int a,int b){//辗转相除法
int temp=0;
while(a>0){
temp=b%a;
b=a;
a=temp;
}
return b;
}
在学习完分治法之后又学会了一种利用分治法求解的方法:
公式如下:
gcd(a,b)= * 2gcd(a/2,b/2) a,b都是偶数
* gcd(a,b/2) a是奇数,b是偶数
* gcd(a/2,b) a是偶数,b是奇数
* gcd((a-b)/2,b) a,b都是偶数
private static int gcd(int a, int b) {
if(a%b==0){
return b>0?b:-b;
}
if(b%a==0){
return a>0?a:-a;
}
if(a%2==0 && b%2==0){
return 2*gcd(a/2,b/2);
}else if(a%2==1 && b%2==0){
return gcd(a,b/2);
}else if(a%2==0 && b%2==1){
return gcd(a/2,b);
}else{
return gcd((a-b)/2,b);
}
}