您的位置:首页 > 其它

两种方法求最大公约数

2017-10-07 15:40 260 查看
之前求最大公约数只知道最经典的辗转相除法:

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: