一般求解最大公约数的两种算法,分别是辗转相除法与更相减损术。
辗转相除法说的是:两个整数a,b(a比b大,下同)的最大公约数等于a%b与b的最大公约数。
更相减损术说的是:两个整数a,b(a比b大,下同)的最大公约数等于a-b与b的最大公约数。
下面来实现这两种算法:
public class Gcd {
//辗转相除法
public static int gcd1(int x, int y) {
if (x < y) {
int tmp = x;
x = y;
y = tmp;
}
if (x % y == 0) {
return y;
}
return gcd1(x % y, y);
}
// 更相减损术
public static int gcd2(int x, int y) {
if (x == y) {
return y;
}
if (x < y) {
int tmp = x;
x = y;
y = tmp;
}
return gcd2(x - y, y);
}
}
但是上述两种方案都还不是最优的,辗转相除法的问题在于取模操作运算代价太大,而更相减损术的问题就是计算量太大了,比如求(5000,1)的最大公约数,需要循环5000次。
我们根据