我们平常求两个数的最大公约数,用到就是欧几里得算法,也就是辗转相除法,也就是递归方法,如果数据大的话,复杂度也不小。

int gcd(int x,int y)
{
    return y==0?x:gcd(y,x%y);
}

但是我们是可以对这个进行优化的;
我们用不断除以2来对这个进行一点小优化(可以提高gcd效率)。
我们判断这么几种情况:
1.
x=y,那么gcd(x,y)=x;
2.
x,y都是偶数,那么gcd(x,y)=2*gcd(x/2,y/2);
3.
x为偶数,y为奇数,那么gcd(x,y)=gcd(x/2,y);
4.
x为奇数,y为偶数,那么gcd(x,y)=gcd(x,y/2);
5.
x,y都是奇数,(假设x>y),那么gcd(x,y)=gcd(x-y,y);
代码:

int gcd(int x,int y)
{
    int i,j;
    if(x==0)return y;
    if(y==0)return x;
    for( i=0;(x&1)==0;i++)
        x>>=1;
    for( j=0;(y&1)==0;j++)
        y>>=1;
        if(i<j)
        {
            j=i;
        }
        while(1)
        {
            if(x<y)
            {
                int tem;
                tem=x;
                x=y;
                y=tem;
            }
            if(x==y)
            {
                return y<<i;
            }
            else
            {
                x=x-y;
                while((x&1)==0)
                {
                    x>>=1;
                }
            }
        }
}