Algorithm 两个以上数字的欧几里德最大公约数

Algorithm 两个以上数字的欧几里德最大公约数,algorithm,math,greatest-common-divisor,Algorithm,Math,Greatest Common Divisor,有人能举一个例子,为两个以上的数字找到最大公约数算法吗 我相信编程语言并不重要 从第一对开始,获取他们的GCD,然后获取该结果的GCD和下一个数字。明显的优化是,如果运行的GCD达到1,您可以停止。我正在观看这部电影,看看是否还有其他优化。:) 哦,这可以很容易地并行化,因为操作是可交换/关联的。三个数字的GCD可以计算为GCD(a,b,c)=GCD(GCD(a,b),c)。您可以迭代应用欧几里德算法、扩展欧几里德算法或二进制GCD算法,并得到您的答案。不幸的是,我不知道还有其他(更聪明的)方法

有人能举一个例子,为两个以上的数字找到最大公约数算法吗


我相信编程语言并不重要

从第一对开始,获取他们的GCD,然后获取该结果的GCD和下一个数字。明显的优化是,如果运行的GCD达到1,您可以停止。我正在观看这部电影,看看是否还有其他优化。:)


哦,这可以很容易地并行化,因为操作是可交换/关联的。

三个数字的GCD可以计算为
GCD(a,b,c)=GCD(GCD(a,b),c)
。您可以迭代应用欧几里德算法、扩展欧几里德算法或二进制GCD算法,并得到您的答案。不幸的是,我不知道还有其他(更聪明的)方法可以找到GCD。

在Java中(不是最优的):

公共静态int GCD(int[]a){
int j=0;
布尔b=真;
for(int i=1;i如果(b==0 | | i我刚刚更新了一个Wiki页面

[

这需要任意数量的术语。 使用GCD(5,2,30,25,90,12)

模板类型GCD(int nargs,…)
{
va_列表arglist;
va_启动(arglist,nargs);
AType*术语=新的AType[nargs];
//将值放入数组中
for(int i=0;i>=1;
}
}
//如果S中的一些数字是偶数,一些是奇数,则将所有偶数除以2。
如果(numEven>0&&numOdd>0)
{
for(int i=0;i>=1;
}
}
//如果S中的每个数字都是奇数,那么选择S中的任意元素并称之为k。
//用| n替换其他元素,例如n−k |/2。
如果(numEven==0)
{
for(int i=0;i>1;
}
}
}而(numEven+numOdd>1);
//最后只有一个剩余元素将最终答案乘以2。
for(int i=0;i将术语[i]返回给我认识的一方有点晚,但使用Sam Harwell对算法的描述,实现了一个简单的JavaScript:

function euclideanAlgorithm(a, b) {
    if(b === 0) {
        return a;
    }
    const remainder = a % b;
    return euclideanAlgorithm(b, remainder)
}

function gcdMultipleNumbers(...args) { //ES6 used here, change as appropriate
  const gcd = args.reduce((memo, next) => {
      return euclideanAlgorithm(memo, next)}
  );

  return gcd;
}

gcdMultipleNumbers(48,16,24,96) //8

对于golang,使用余数

func GetGCD(a, b int) int {
    for b != 0 {
        a, b = b, a%b
    }
    return a
}
func GetGCDFromList(numbers []int) int {
    var gdc = numbers[0]
    for i := 1; i < len(numbers); i++ {
        number := numbers[i]
        gdc  = GetGCD(gdc, number)
    }
    return gdc
}
func GetGCD(a,b int)int{
对于b!=0{
a、 b=b,a%b
}
归还
}
func GetGCDFromList(数字[]int)int{
var gdc=数字[0]
对于i:=1;i
虽然答案是正确的,你能为一个未回答的问题提供答案也很好,但解释你的答案会让它成为一个很好的答案。对于OP来说,重要的是不仅要得到正确的答案,还要理解它!@ShellFish你所说的未回答的问题是什么意思?这原本是一个不同问题的一部分吗那是(重复)合并到这一个?我同意这个答案需要更多的解释。哦,对不起,我在审查队列中找到了这个答案,并假设它因为你的第一句话而没有得到回答。我的错误,其他答案没有显示在那里。--顺便说一句,审查队列是一个需要同行评估的问题列表,例如第一次ansWER(像您的)或需要编辑的帖子。
func GetGCD(a, b int) int {
    for b != 0 {
        a, b = b, a%b
    }
    return a
}
func GetGCDFromList(numbers []int) int {
    var gdc = numbers[0]
    for i := 1; i < len(numbers); i++ {
        number := numbers[i]
        gdc  = GetGCD(gdc, number)
    }
    return gdc
}