直接給出結論:
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);
}
}