import java.util.Collections; import java.util.HashSet; import java.util.Set; public class GCD { /** * 求最大公約數 展轉相除法(歐幾里德算法) 例如,求(319,377): ∵ 319÷377=0(餘319) * ∴(319,377)=(377,319); ∵ 377÷319=1(餘58) ∴(377,319)=(319,58); ∵ * 319÷58=5(餘29) ∴ (319,58)=(58,29); ∵ 58÷29=2(餘0) ∴ (58,29)= 29; ∴ * (319,377)=29。 能夠寫成右邊的格式。 * 用展轉相除法求幾個數的最大公約數,能夠先求出其中任意兩個數的最大公約數,再求這個最大公約數與第三個數的最大公約數,依次求下去,直到最後一個數爲止。 * 最後所得的那個最大公約數,就是全部這些數的最大公約數。 * * @param m * @param n * @return */ public static int GCD(int m, int n) { int result = 0; while (n != 0) { result = m % n; m = n; n = result; } return m; } /** * 質因數分解法:把每一個數分別分解質因數,再把各數中的所有公有質因數提取出來連乘,所得的積就是這幾個數的最大公約數。 (小學學的方法) * * @param m * @param n * @return */ public static int PrimeGCD(int m, int n) { int result = 1; Set<Integer> set1 = getFactor(m); Set<Integer> set2 = getFactor(n); // 取交集 set1.retainAll(set2); // 取最大 result = Collections.max(set1); return result; } /** * 更相減損術」,即「可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。」 * @param m * @param n * @return */ public static int equalGCD(int m, int n) { while (m != n) { if (m > n) m -= n; else n -= m; } return m; } /** * 獲取某一數值的全部因數 * * @param m * @return */ private static Set<Integer> getFactor(int m) { Set<Integer> set = new HashSet<Integer>(); for (int i = 2; i <= m; i++) { if (m % i == 0) { set.add(i); } } return set; } public static void main(String[] args) { // int result = GCD(32, 48); // int result = PrimeGCD(32, 48); int result = equalGCD(32, 48); System.out.println(result); } }