GCD算法Java

时间:2016-05-11 10:28:17

标签: java greatest-common-divisor

我是Java的新手,我想要求解释一个非常简单的代码。它应该找到两个数字的GCD(最大公约数)。可悲的是,我无法理解checkGCD功能背后的逻辑。 b a mod b 究竟发生了什么,它们可以获得共同点?

private static int checkGCD (int a, int b) {
    if (b == 0) {
        return a;
    }

    return checkGCD(b, a%b);
}

3 个答案:

答案 0 :(得分:1)

如果传递给b的值是0,它将返回另一个值,它将再次chechGcd,其值为b,模数为b,称为递归

答案 1 :(得分:0)

示例对我来说总是最有帮助的,这是维基百科的一个很好的例子,它实际上解释了算法的运作方式:

为了说明,欧几里德算法可用于找到a = 1071和b = 462的最大公约数。首先,从1071中减去462的倍数,直到余数小于462.两个这样的倍数可以是减去(q0 = 2),剩余147:

1071 = 2 × 462 + 147.

然后从462中减去147的倍数,直到余数小于147.可以减去三个倍数(q1 = 3),剩余的21个:

462 = 3 × 147 + 21.

然后从147减去21的倍数,直到余数小于21.可以减去七个倍数(q2 = 7),不留余数:

147 = 7 × 21 + 0.

由于最后一个余数为零,算法以21作为1071和462的最大公约数结束。这与上面的素数因子分解所得到的gcd(1071,462)一致。

来源:https://en.wikipedia.org/wiki/Euclidean_algorithm#Worked_example

答案 2 :(得分:0)

当且仅当它除以b和a - b时,数字除以a和b。

通过重复减去b,这意味着当且仅当它除以b和a b时,数字除以a和b。 (a%b代表除以b后的余数。)

由于除以a和b的数字与除以b和a%b的数字相同,因此,a和b的最大公约数与b和a的最大公约数相同%b。

因此,要找到两个数字的GCD,您可以在将较大的值除以较小值之后用余数替换较大的数字。你可以反复这样做,直到较小的分割较大而没有余数。较小的一个是原始两个数字的GCD。

link with examples可能会有所帮助。