最大公約數,也稱最大公因數、最大公因子,指兩個或多個整數共有約數中最大的一個。解法有很多,現在來總結一下:
1、窮舉法
這是暴力的方法,即選擇兩個數中較小的一個作為遍歷的范圍大小。然后從1開始遍歷,判斷同時滿足是兩個數的因子的數有哪些,然后求出最大值即可。
2、更相減損法
這個思想起源於我國古代的《九章算術》,它原本是為約分而設計的,但它適用於任何需要求最大公約數的場合。原文是這么描述的:“可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。”
翻譯成白話將就是:
第一步:對於任意給定的兩個正整數a、b,要求出他們的最大公約數,首先判斷他們倆是否都是偶數(能被2整除),如果都是偶數則一直除以2約簡,直至不能再被2整除,while(a%2==0 && b%2==0){a = a/2;,b=b/2;};
第二步:如果不是,那么就執行下一步,即用較大的數減去較小的數,然后將所得的差值賦值給原先擁有較大值的那個變量,再拿這個變量與較小值的那個變量進行比較,繼續用二者中較大的減去較小的,直到兩個變量相等;
最后,將第一步約簡掉的2依次乘以第二步得到的“等數”就是最大公約數。算法實現代碼如下:
public int gcd_num2(int a,int b){ while (a!=b){ if (a>b){ a = a-b; }else { b = b-a; } } return a; }
3、輾轉相除法
輾轉相除法:輾轉相除法是求兩個自然數的最大公約數的一種方法,也叫歐幾里德算法。對於任意給定的兩個正整數,假設a>b,那么先判斷b是否為0,如果為0,則最大公約數直接就是a,如果不為0,就將兩個整數a與b進行相除,如果余數為0(a%b==0),則b為兩數的最大公約數;如果不等於0,則將b賦值給a,將余數賦值給b,再對新的a、b進行遞歸運算求最大公約數,遞歸的結束條件就是b==0。
public int gcd_num(int a,int b){ return b == 0?a:gcd_num(b,a%b); }
參考自:百度百科