我知道如何编写代码,找到2个数字的GCD。但是,我试图解决找到 n 数字的GCD的问题,我认为该算法与使用Eucledian算法略有不同。我的代码可以编译,但它总是给我错误的结果。例如,当我将 n = 2 , 16 的GCD和 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--;
}
}
你们可以在我的代码中找到错误吗?
答案 0 :(得分:2)
你的代码不计算输入数组的最大公约数 - 它计算有多少条目可被数组的最小元素d整除,然后有多少可被一个小的整除,依此类推,直到d这与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;
}
答案 1 :(得分:0)
如果有人发现它有用,这里是JavaScript中的Euclidean算法的实现。
function EuclideanGCD(a, b) {
// Make sure a > b, interchange values
if (a < b) {
c = a;
a = b;
b = c
}
// If A = 0 then GCD(A,B) = B and we can stop.
if (a == 0) {
return b;
// If B = 0 then GCD(A,B) = A and we can stop.
} else if (b == 0) {
return a;
} else {
let gdc = 0;
let quotient = Math.floor(a / b); // Get the divisor
let remainder = a % b; // Get the remainder
// Make a recursive call, till we hit 0
gdc = EuclideanGCD(b, remainder);
return gdc;
}
}
var gcd = EuclideanGCD(234, 357);
console.log(gcd); // Outputs: 3