求兩數的最大公約數 -- 輾轉相除法

直接給出結論
x 和 y的最大公約數 可以轉爲 x%y 和 y的最大公約數 (當然也可以y%x 和 x的最大公約數)。
這樣依次遞歸,直到 x%y==0便取得最大公因數y。

下面給出一個最大公約數可以解決的問題:
來自leetcode

/**
 * 給定一副牌,每張牌上都寫着一個整數。
 * 此時,你需要選定一個數字 X,使我們可以將整副牌按下述規則分成 1 組或更多組:
 * 每組都有 X 張牌。
 * 組內所有的牌上都寫着相同的整數。
 * 僅當你可選的 X >= 2 時返回 true。
 * 示例:
 * 輸入:[1,2,3,4,4,3,2,1]
 * 輸出:true
 * 解釋:可行的分組是 [1,1],[2,2],[3,3],[4,4]
 */
public class HasGroupsSizeX {
	
    public boolean hasGroupsSizeX(int[] deck) {
    	//題目中給定了 deck中數的大小 1到10000;
        int[] count = new int[10000];
        //將deck中的數值對應的count數組的下標
        //這樣遍歷一遍就可以知道deck中每個數出現的次數
        for (int c: deck)
            count[c]++;

        int g = -1;								//記錄最大公約數
        for (int i = 0; i < 10000; ++i)
            if (count[i] > 0) {					//表示deck中沒有這個數
                if (g == -1) 					//更新第一個deck中出現的數
                    g = count[i];
                else
                	//計算最大公約數
                    g = gcd(g, count[i]);
            }
        return g >= 2;
    }

    /**
     * x 和 y的最大公約數 可以轉爲  x%y 和 y的最大公約數 (當然也可以y%x 和 x)
     * @param x  假設爲取餘結果
     * @param y
     * @return
     */
    public int gcd(int x, int y) {
        return x == 0 ? y : gcd(y%x, x);   // 也可以寫爲  return x == 0 ? y : gcd(x%y, y);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章