Java:获得最大公约数

2022-08-31 10:02:40

我已经看到这样的函数存在于 ,即 BigInteger#gcd。Java中是否有其他函数也适用于其他类型的(或)?这似乎是有道理的(对于各种过载),但它不存在。是别的吗?BigIntegerintlongIntegerjava.lang.Math.gcd


(请不要将这个问题与“我自己如何实现这一点”混淆,拜托!


答案 1

据我所知,没有任何内置的基元方法。但是像这样简单的东西应该可以解决问题:

public int gcd(int a, int b) {
   if (b==0) return a;
   return gcd(b,a%b);
}

如果你喜欢这种事情,你也可以用一行:

public int gcd(int a, int b) { return b==0 ? a : gcd(b, a%b); }

应该注意的是,两者之间绝对没有区别,因为它们编译为相同的字节码。


答案 2

对于int和long,作为基元,不是真的。对于 Integer,可能有人写了一个。

鉴于 BigInteger 是 int、Integer、long 和 Long 的(数学/函数)超集,如果您需要使用这些类型,请将它们转换为 BigInteger,执行 GCD,然后将结果转换回来。

private static int gcdThing(int a, int b) {
    BigInteger b1 = BigInteger.valueOf(a);
    BigInteger b2 = BigInteger.valueOf(b);
    BigInteger gcd = b1.gcd(b2);
    return gcd.intValue();
}

推荐