java实现三种方式求最大公约数

     /**
     * 欧几里得算法:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。
     */
    private static int gcdV1(int a,int b){
        int big = a > b ? a : b;
        int small = a < b ? a : b;
        if (big % small == 0){
            return small;
        }
        return gcdV1(small,big % small);
    }

    /**
     * 更相减损术:两个正整数a和b(a>b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数。
     */
    private static int gcdV2(int a,int b){
        if (a == b){
            return a;
        }
        int big = a > b ? a : b;
        int small = a < b ? a : b;
        return gcdV2(big-small,small);
    }

    private static int gcd(int a,int b){
        if (a == b){
            return a;
        }
        //当a和b均为偶数时,gcd(a,b)=2*gcd(a/2,b/2)=2*gcd(a>>1,b>>1)
        if ((a & 1)==0 && (b & 1)==0){
            return gcd(a>>1,b>>1) << 1;
        }
        //当a为偶数,b为奇数时,gcd(a,b)=gcd(a/2,b)=gcd(a>>1,b)
        if ((a & 1)==0 && (b & 1)!=0){
            return gcd(a>>1,b);
        }
        //当a为奇数,b为偶数时,gcd(a,b)=gcd(a,b/2)=gcd(a,b>>1)
        if ((a & 1)!=0 && (b & 1)==0){
            return gcd(a,b>>1);
        }
        //当a和b均为奇数时,先利用更相减损术运算一次,gcd(a,b)=gcd(b,a-b),此时a-b必然是偶数,
        // 然后继续移位运算
        int big = a>b ? a:b;
        int small = a

欧几里得算法:取模运算的性能较差

更相减损术:当两数相差悬殊时,如计算10000和1的最大公约数,就要递归9999次。

欧几里得算法、更相减损术和移位运算相结合可以有效解决上述两个问题。

你可能感兴趣的:(算法,代码)