如何求出最大公约数

       题目:
       写一段代码,求出两个数的最大公约数,要尽量优化算法的性能。
       1.暴力枚举
       2.辗转相除法
       两个正整数a和b(a>b),他们的最大公约数等于a除以b的余数c和d之间的最大公约数
       3.更相减损术
       两个正整数a和b(a>b),他们的最大公约数等于a-b的差值c和较小数b的最大公约数。
       4.将2和3结合起来
       当a和b均为偶数时,gcd(a,b) = 2 * gcd(a/2,b/2) = 2 *gcd(a>>1,b>>1)
       当a为偶数,b为奇数时,gcd(a,b) = gcd(a/2,b) = gcd(a>>1,b)
       当a为奇数,b为偶数时,gcd(a,b) = gcd(a,b/2) = gcd(a,b>>1)
       当a和b都为奇数时,先利用更相减损法运算一次,gcd(a,b) = gcd(b,a-b),此时a-b必然为偶数,然后又可以继续进行移位运算.

public class getGreatestCommon {

    //使用暴力枚举的方法,时间复杂度为O(min(a,b))
    public static int getGreatestCommonDivisor(int a,int b){
        int big = a>b ? a:b;
        int small = a1;i--){
            if(small % i==0 && big%i==0){
                return i;
            }
        }
        return 1;
    }

    //当两个整数较大时,做a%b的性能比较差
    public static int getGreatestCommonDivisorV2(int a,int b){
        int big = a>b ? a:b;
        int small = ab ? a:b;
        int small = a>1,b>>1)<<1;
        }else if((a&1) == 0 &&(b&1)!=0){
            return gcd(a>>1,b);
        }else if((a&1) !=0 &&(b&1)==0){
            return gcd(a,b>>1);
        }else{
            int big = a>b ? a:b;
            int small = a

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