找到n个数字的GCD

时间:2013-03-12 00:32:28

标签: java

我正在尝试编写一个简单的程序,要求输入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个等等。我想一旦我得到逻辑部分,我就会明白如何更容易地做到这一点。

2 个答案:

答案 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。当然,这可以扩展到我们无法准确想象的更高维度!