我知道如何编写代码以找到2个数字的GCD。但是,我正在尝试解决找到n个GCD的问题,我认为该算法与使用Eucledian算法有点不同。我的代码可以编译,但是总是给我错误的结果。例如,当我将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]);
可以在网上找到两个数字的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] 删除。
我来说两句