C++ 多个数的GCD

C++ 多个数的GCD,c++,C++,我知道如何编写一个代码来查找2个数的GCD。然而,我试图解决一个问题,找到一个n个数的GCD,我认为该算法与使用欧氏算法有点不同。我的代码可以编译,但它总是给我错误的结果。例如,当我把n=2,GCD为16和12时,它给出了答案8。这是我的密码: #include<iostream> using namespace std; int main() { int a,b[100],c,d,e=0; cin>>a; for(c=0 ; c<a ; c

我知道如何编写一个代码来查找2个数的GCD。然而,我试图解决一个问题,找到一个n个数的GCD,我认为该算法与使用欧氏算法有点不同。我的代码可以编译,但它总是给我错误的结果。例如,当我把n=2,GCD为16和12时,它给出了答案8。这是我的密码:

#include<iostream>
using namespace std;
int main()
{
    int a,b[100],c,d,e=0;
    cin>>a;
    for(c=0 ; c<a ; c++)
    {
        cin>>b[c];
    }
    for(c=0 ; c<a-1 ; c++)
    {
        if(c < 1)
        {
            d = b[c]; 
        }
        if(b[c] < d)
        {
            d = b[c];
        }
    }
    while(d>0)
    {
        for(c=0 ; c<a ; c++)
        {
            if(b[c] % d < 1)
            {
                e++;
            }
        }
        if(e == c)
        {
            cout<<d;
            break;
        }
        d--;
    }
}

你们能找出我的代码中的错误吗?

你们的代码并没有计算输入数组的最大公约数-它计算有多少个条目可以被数组中最小的元素d平均整除,然后有多少条目可以被一个较小的元素整除,依此类推,直到d为0。这与GCD毫无关系

一个简单的方法——虽然不一定是最快的——是基于这样一个事实,即三个数字的GCD必须与其中任何一个数字的GCD以及其他两个数字的GCD相同

gcd(a, b, c) = gcd(gcd(a, b), c) = gcd(a, gcd(b, c)) = gcd(gcd(a, c), b)
对n个输入的扩展是基本的:

int result = a[0];

for (int i = 1; i < a.Length; ++i)
    result = gcd(result, a[i]);

C允许更简洁的公式,但是在其他语言中,这可能在C++中不起作用,它会调用未定义的行为,例如:

static int gcd (int a, int b)
{
    while (b != 0)
        b = a % (a = b);

    return a;
}

如果有人觉得它有用,下面是一个用JavaScript实现的欧几里德算法

欧几里德函数{ //确保a>b,交换值 如果aconsole.loggcd;//输出:3您将这种方式弄得太复杂了。要找到两个数字的GCD,请使用:int-GCDint a,int-b{return b==0?a:GCDb,a%b;}@CodyGray我实际上在这里试图找到两个以上数字的GCD是的,我知道了,但这并不能证明代码的复杂性。查找2+n个数字的GCD只是查找2个数字的GCD的一个迭代。在上一个代码段中,a的值在没有a的情况下被修改,这会调用未定义的行为。你把代码做得有点太简单了。@Cody:我把它改成了一个用C以外的语言编写的版本,因为主题被标记在原始代码调用未定义行为的地方。哦,伙计们,我发现了错误,实际上是因为我的变量e,但我已经修复了它,它显示了正确的结果。因为我愚蠢的错误,我很抱歉把这个贴在这里
static int gcd (int a, int b)
{
    while (b != 0)
        b = a % (a = b);

    return a;
}