下面先介绍一下欧几里得的辗转相除法的原理:
辗转相除法使用到的原理很聪明也很简单,假设用 f( x, y ) 表示 x, y 的最大公约数,取 k = x / y,b = x % y,则 x = ky + b,如果一个数能够同时整除 x 和 y,则必能同时整除 b 和 y。而能够同时整除 b 和 y 的数也必能同时整除 x 和 y,即 x 和 y 的公约数与 b 和 y 的公约数是相同的,其最大公约数也是相同的 ,则有f ( x, y ) = f ( y, y % x ) ( y > 0 ),如此便可把原问题转化为求两个更小数的最大公约数,两个数取模为 0。计算出最大公约数之后,最小公倍数就比较简单了。 可以用 x * y / f(x, y)就行了。
以下给出用Java实现的算法。
/**
* 最大公约数计算方法
*
* @param a
* @param b
* @return
*/
public static int getGCD(int a, int b) {
int mod = a % b;
if (mod == 0) {
return b;
} else {
return getGCD(b, mod);
}
}
再给出main方法。
public static void main(String[] args) throws IOException {
int num1 = **;
int num2 = **;
int gcd = -1;
if (num1 == 0 || num2 == 0) {
System.out.println("两个数中不能有0");
} else {
gcd = GcdEuclidUtil.getGCD(num1, num2);
System.out.println(num1 + " 和 " + num2 + " 最大公约数是 " + gcd);
}
if (gcd != -1) {
int lcm = num1 * num2 / gcd;
System.out.println(num1 + " 和 " + num2 + " 最小公倍数是 " + lcm);
}
}