两种方法求最大公约数

之前求最大公约数只知道最经典的辗转相除法:

    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);
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_37540865/article/details/78169907