編程之美2.7——最大公約數

求兩數最大公約數。算法

【思路】spa

1.常規:設求最大公約數算法爲f(m,n),則f(m,n)=f(n,m%n)(m>n>0).當n==0時,返回mcode

原理:x=ky+b,則f(x,y)=f(y,b)。blog

缺點:除法或取餘運算代價較大get

2.用減法替代取餘。即f(m,n)=f(n,m-n)(m>n>0).class

缺點:增長了迭代次數。對於一個超大數和一個1,消耗太大。原理

3.用覺得代替除法。總結

原理:設y=k*y1, x=k*y2,則f(x,y)=k*f(x1,y1);di

若x=p*x1,p是素數,且y%p!=0(即y不能被p整除),有f(x,y)=f(p*x1, y)=f(x1,y);co

取p=2,則有三種狀況:x y均爲偶數;x y一偶一奇;x y均爲奇數,對於第三種狀況,就用思路2,用差來表示。

【codes】

//method1
int
getcomdev1(int a, int b) { if(a<b) return getcomdev(b, a); return (!b)?a:getcomdev1(b, a%b); }
//method2
int getcomdev(int a, int b)
{
    if(a<b)
        return getcomdev(b, a);
    if(b==0)
        return a;
    if(a%2==0&&b%2==0)
        return getcomdev(a>>1, b>>1)<<1;
    if(a%2==0&&b%2!=0)
        return getcomdev(a>>1, b);
    if(a%2!=0&&b%2==0)
        return getcomdev(a, b>>1);
    if(a%2!=0&&b%2!=0)
        return getcomdev(b,a-b);
}

【總結】

1.method1的一句話代碼多麼簡潔

2.method2的各類狀況都要考慮到,與2的乘除運算所有用移位替代。

相關文章
相關標籤/搜索