多个GCD

用户名

我知道如何编写代码以找到2个数字的GCD。但是,我正在尝试解决找到n个GCD的问题,我认为该算法与使用Eucledian算法有点不同。我的代码可以编译,但是总是给我错误的结果。例如,当我将n = 2,GCD为1612时,得出的答案为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--;
    }
}

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

达斯·吉兹卡(DarthGizka)

您的代码不会计算输入数组的最大公约数-它计算的是多少个条目可以被数组的最小元素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]);

可以在网上找到两个数字的GCD代码,例如在Rosetta Code上我的最爱之一是这个简单的迭代版本:

int gcd (int a, int b)
{
    while (b)
    {
        int t = b;
        b = a % b;
        a = t;
    }

    return a;
}

C#允许更简洁的表述,但是在其他语言中,这可能行不通(例如,在C ++中,它将调用未定义的行为):

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

    return a;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章