找到n个数字的GCD

我正在尝试编写一个简单的程序,要求输入5个数字并输出它们的GCD。 我已经用一个简单的方法发现了如何用两个数字做到这一点:

private static int gcd(int number1, int number2) //Finds GCD of 2 numbers. { if(number2 == 0) { return number1; } return gcd(number2, number1%number2); } 

返回语句中的实际数学虽然令我感到困惑,但我不确定如何用5个甚至更多的数字写出来。 我听说以递归方式执行此方法,例如“gcd(a,b,c)= gcd(gcd(a,b),c)”是最好的方法,但我想我实际上遇到了麻烦有问题的数学逻辑。 我只需要一个很好的起点,真的,如何返回3个数字,然后是4个,然后是5个等等。我想一旦我得到逻辑部分,我就会明白如何更容易地做到这一点。

您应该将现有的gcd(int, int)方法视为“黑匣子”; 你的新gcd(int, int, int, int, int)方法可以调用它而不知道它是如何工作的。 你会写:

 private static int gcd(int a, int b, int c, int d, int e) { return gcd(gcd(a, b), gcd(gcd(c, d), e)); } 

或者,对于更通用的解决方案,您可以使用Java 5的var-args支持编写一个方法gcd(int, int...) ,它接受任意数量的参数:

 private static int gcd(int number1, int... otherNumbers) { int result = number1; for(int number: otherNumbers) result = gcd(result, number); return result; } 

(注意,在这两种情况下,这个函数在编程意义上都不是“递归的”。前一种方法递归地嵌套了它的gcd(int, int)调用,但这并不是程序员所说的“递归”。你原来的然而, gcd(int, int)函数递归的,因为它实际上调用了它自己。)

这是关于最常见因素的重要观点。 想象一个矩形的地板,尺寸为m和n。 m和n的GCD是最大方形瓷砖的尺寸,可以完美地贴合在该地板上。

因此,在您使用的算法中,您从两个数字开始,例如8和10.您的程序然后用一个数字(比如8)和两个数字的模数重复该过程,这是2.这相当于斩波关闭一个8×8的部分,因为我们知道进入剩余位的任何瓷砖也适合该区域。 我们留下了2×8的部分。 重复这个过程,我们将获得2作为GCD。 我希望能够清除你正在使用的算法的实际含义。

因此,将这个概念扩展到三个数字的GCD,我们可以说m,n和p的GCD是最大的立方体块 ,它将适合尺寸为mxnx p的矩形棱柱。 为了找到这个GCD,我们首先找到适合棱镜的一个面的方形瓷砖。 然后我们可以使用这个尺寸来切割棱镜的截面,并截取该横截面的GCD。 当然,这可以扩展到我们无法准确想象的更高维度!