1. 概述

给定两个整数 ab,如果它们的最大公约数为 1,我们就称它们是 互质(relatively prime) 的。有时也被称为 互素coprime

在本篇教程中,我们将通过 Java 来实现如何判断两个数是否互质。

2. 最大公约数算法

判断两个数是否互质,核心在于求它们的最大公约数(gcd)。如果 gcd(a, b) = 1,那么 ab 就是互质的。

因此,我们的问题转化为:如何高效地计算两个数的最大公约数。

3. 欧几里得算法实现

我们使用经典的 欧几里得算法(Euclidean Algorithm) 来计算两个整数的最大公约数。

该算法的核心思想是:

  1. 用较大的数除以较小的数,得到余数;
  2. 将较小的数作为新的被除数,余数作为新的除数;
  3. 重复上述步骤,直到余数为 0;
  4. 此时的除数就是最大公约数。

举个例子,我们来计算 a = 81b = 35 的最大公约数:

81 ÷ 35 = 2 余 11
35 ÷ 11 = 3 余 2
11 ÷ 2 = 5 余 1
2 ÷ 1 = 2 余 0

最终余数为 0,此时除数为 1,说明 gcd(81, 35) = 1,因此它们互质 ✅。

3.1 迭代实现

下面是一个使用迭代方式实现的 Java 版本:

int iterativeGCD(int a, int b) {
    int tmp;
    while (b != 0) {
        if (a < b) {
            tmp = a;
            a = b;
            b = tmp;
        }
        tmp = b;
        b = a % b;
        a = tmp;
    }
    return a;
}

这段代码通过不断交换 ab 的值,模拟了欧几里得算法的计算过程。

3.2 递归实现

如果你更喜欢函数式风格,也可以使用递归实现:

int recursiveGCD(int a, int b) {
    if (b == 0) {
        return a;
    }
    if (a < b) {
        return recursiveGCD(b, a);
    }
    return recursiveGCD(b, a % b);
}

这个版本逻辑更清晰,也更简洁,适合理解算法流程。

4. 使用 BigInteger 的 gcd 方法

其实,Java 已经为我们提供了现成的 gcd 实现:BigInteger.gcd() 方法。它内部也是基于欧几里得算法实现的。

我们可以借助它,非常简单地实现判断两个数是否互质:

boolean bigIntegerRelativelyPrime(int a, int b) {
    return BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).equals(BigInteger.ONE);
}

✅ 优点:代码简洁、可读性强
❌ 缺点:需要将 int 转换为 BigInteger,在性能敏感场景下略显笨重

5. 总结

本篇教程中,我们介绍了三种判断两个整数是否互质的方式:

  1. 迭代实现欧几里得算法:适合性能敏感场景
  2. 递归实现欧几里得算法:适合教学或理解算法逻辑
  3. **使用 BigInteger.gcd()**:简单、安全,适合日常开发使用

你可以根据实际需求选择合适的实现方式。比如在算法题中,建议自己实现 gcd;在业务代码中,直接使用 BigInteger 更省事。

如需查看完整示例代码,欢迎访问 GitHub 仓库


原始标题:Find If Two Numbers Are Relatively Prime in Java