我是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);
}
答案 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可能会有所帮助。