我正在尝试编写一个简单的程序,要求输入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个等等。我想一旦我得到逻辑部分,我就会明白如何更容易地做到这一点。
答案 0 :(得分:3)
您应该将现有的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)
函数是递归的,因为它实际上会调用自身。)
答案 1 :(得分:3)
这里是关于最常见因素的重要观点。想象一块矩形的地板,尺寸为m和n。 m和n的GCD是最大方形瓷砖的尺寸,完美地适合该地板。
因此,在您使用的算法中,您从两个数字开始,例如8和10.您的程序然后用一个数字(比如8)和两个数字的模数(即2)重复该过程。这相当于切断8x8部分,因为我们知道进入剩余部分的任何切片也适合该区域。我们留下了2x8的部分。重复这个过程,我们将得到2作为GCD。我希望能够清除您正在使用的算法的实际含义。
因此,将这个概念扩展到三个数的GCD,我们可以说m,n和p的GCD是最大的立方块,它将适合矩形棱柱,尺寸为mxnx p 。为了找到这个GCD,我们首先找到适合棱镜的一个面的方形瓷砖。然后我们可以使用这个尺寸来切割棱镜的截面,并截取该横截面的GCD。当然,这可以扩展到我们无法准确想象的更高维度!