直接给出结论:
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);
}
}