求最大公約數
阿新 • • 發佈:2020-10-05
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); } } }