java 三種方法實現最大公約數

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);
    }
}
相關文章
相關標籤/搜索