Java 求n个数的GCD

Java 求n个数的GCD,java,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); } 然而,return语句中的实

我试图写一个简单的程序,要求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);
}

然而,return语句中的实际数学问题让我感到困惑,我不确定如何用5个甚至更多的数字写出它。我听说递归地使用这个方法,比如“gcd(a,b,c)=gcd(gcd(a,b,c)”是最好的方法,但我想我在讨论中的数学的实际逻辑方面遇到了问题。我只需要一个好的起点,真的,关于如何返回3个数字,然后是4个,然后是5个,等等。我想,一旦我把逻辑部分记下来,我就会明白如何做得更简单。

你应该把你现有的
gcd(int,int)
方法当作一个“黑盒子”;新的
gcd(int,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)
函数是递归的,因为它实际上调用了自己。)

您应该将现有的
gcd(int,int)
方法视为“黑盒”;新的
gcd(int,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)重复该过程。这相当于切掉一个8x8部分,因为我们知道进入剩余部分的任何瓷砖也将适合该区域。我们剩下一个2x8的部分。重复这个过程,我们将得到2作为GCD。我希望这能澄清你正在使用的算法的实际意义


把这个概念推广到三个数的GCD,我们可以说,m,n,p的GCD是最大的立方块,它将适合于尺寸为m x n x p的矩形棱镜。为了找到这个GCD,我们首先找到适合棱镜其中一面的方形瓷砖。然后我们可以用这个尺寸来切割一个横截面,也就是说,棱镜的横截面,并取该横截面的GCD。当然,这可以扩展到更高的维度,我们无法准确地可视化

以下是关于最大共同因素的重要观点。想象一块尺寸为m和n的矩形地板。m和n的GCD是最大方形瓷砖的尺寸,该瓷砖将完全适合该地板

所以在你使用的算法中,你从两个数字开始,比如8和10。然后,您的程序用一个数字(比如8)和两个数字的模数(即2)重复该过程。这相当于切掉一个8x8部分,因为我们知道进入剩余部分的任何瓷砖也将适合该区域。我们剩下一个2x8的部分。重复这个过程,我们将得到2作为GCD。我希望这能澄清你正在使用的算法的实际意义


把这个概念推广到三个数的GCD,我们可以说,m,n,p的GCD是最大的立方块,它将适合于尺寸为m x n x p的矩形棱镜。为了找到这个GCD,我们首先找到适合棱镜其中一面的方形瓷砖。然后我们可以用这个尺寸来切割一个横截面,也就是说,棱镜的横截面,并取该横截面的GCD。当然,这可以扩展到更高的维度,我们无法准确地可视化

这似乎是以前问过的问题,请参考在任何搜索过程中都没有出现的问题。谢谢你找到这个。这似乎是以前问过的问题,请参考在任何搜索中都没有出现的问题。谢谢你找到这个。啊,好的,是的,我有一些类似的东西,但它给了我错误,所以我假设我的问题只是在return语句中对int进行排序。我现在就玩一玩。谢谢。:)啊,好的,是的,我有一些类似的东西,但它给了我错误,所以我假设我的问题只是在return语句中对int进行排序。我现在就玩一玩。谢谢。:)这是一个非常好的视觉效果。非常感谢。这是一个非常好的视觉效果。非常感谢你。