Java函数:如何求两个整数的最大公约数
最大公约数的定义是:在两个或多个整数中最大的能够同时整除他们的正整数,简称为最大公约数(Greatest Common Divisor, GCD)。
通常求最大公约数的方法主要有以下几种:
1. 常规算法
常规算法最简单的思路是从 2 开始遍历,然后找到两个数的最大公约数。循环条件可以设置为 n > 0,只要 n 有值,就一直循环进行下去。
(1)选择两个整数 a 和 b,保证 a >= b。
(2)当 b 不等于 0 时,计算 a 除以 b 中的余数 r,即 a % b = r。
(3)将 a 赋值为 b,将 b 赋值为 r。
(4)重复第二步和第三步,直到 b 等于 0,此时最大公约数为 a。
Java 代码实现:
public static int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
2. 辗转相除法
辗转相除法,也叫欧几里得算法(Euclidean algorithm),是求最大公约数最常用和最古老的算法之一。其基本思路是两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数,不断重复这个过程,直到两个数中的一个为 0 为止。
(1)选择两个整数 a 和 b,保证 a >= b。
(2)计算 a 除以 b 中的余数 r,即 a % b = r。
(3)将 a 赋值为 b,将 b 赋值为 r。
(4)重复第二步和第三步,直到 b 等于 0,此时最大公约数为 a。
Java 代码实现:
public static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
3. 更相减损术
更相减损术,又称贪婪算法(Greedy Algorithm),是一种较慢的求解最大公约数的方法。其核心思想是在两个整数之间不断进行相减操作,直到两个数相等为止。
(1)选择两个整数 a 和 b,保证 a >= b。
(2)计算 a 和 b 的差值,并将结果赋值给 a,即 a = a - b。
(3)如果 a 大于 b,在继续执行第 2 步。
(4)如果 a 小于 b,将 a 和 b 两个数的位置互换,在继续执行第 2 步。
(4)重复执行第 2 步和第 3 步,直到 a 等于 b,此时最大公约数为 a。
Java 代码实现:
public static int gcd(int a, int b) {
while (a != b) {
if (a > b) {
a = a - b;
} else {
int temp = a;
a = b;
b = temp;
}
}
return a;
}
以上三种算法都是求解最大公约数的常用算法,其中辗转相除法是最常用和最有效的方法。实际运用中,我们可以根据不同的数据特点选择不同的算法来实现,以达到更高的效率。
