1. 程式人生 > 實用技巧 >求最大公約數

求最大公約數

public class GreatestCommonDivisor {
    /**
     * 判斷最大公約數:
     * 1)當a b均為偶數,就求a/2和b/2的最大公約數,再*2
     * 2)當a為偶數 b為奇數,就求a/2和b的最大公約數。之所以a/2和b的最大公約數等於a和b的最大公約數,
     *    是因為a=2*n1*n2....,b=n1*n2.....(不包括2),因此2一定不會出現在a b的最大公約數(根據質因數分解法,最大公約數為a b的公共係數的乘積)中。
     * 2)當a為奇數 b為偶數,就求a和b/2的最大公約數
     * 3)當a b均為奇數,就進行更相減損法求解,即求max(a,b)-min(a,b)和min(a,b)的最大公約數,這個最大公約數就是a b的最大公約數。
     * 最壞的情況下,需要進行log_2^{max(a,b)}次右移操作,因此時間複雜度為O(logmax(a,b))
     * 
@return */ public int gcd(int a, int b){ //求最大公約數的a,b不能為0 if(a==0 || b==0){ return 0; } //當a b相等,直接返回a作為公約數 if(a == b){ return a; } //如果a b均為偶數 if((a&1)==0 && (b&1)==0){ return gcd(a>>1,b>>1)<<1; }
//如果a為偶數 b為奇數 else if((a&1)==0 && (b&1)!=0) { return gcd(a>>1,b); }//如果a為奇數 b為偶數 else if((a&1)!=0 && (b&1)==0){ return gcd(a,b>>1); }//如果a b均為奇數 else{ return gcd(a>b?a-b:b-a,a<b?a:b); } } }