我的GCD算法出了什么问题?

时间:2015-09-21 16:49:52

标签: c

这是我尝试计算两个输入数字的GCD:

int rep;
do{
    system ("cls");
    int a, b, gcd=2, e, d;
    cin >> a >> b;
    if(a % b != 0 || b % a != 0){
        do{
            gcd = gcd + 1;
            d = a % gcd;
            e = b % gcd;        
        } while(d==0 && e==0);
        cout << gcd-1;
    }else if(a == 1 || b == 1){
        gcd=1;
        cout << gcd;
    }else if(a >= b){
        gcd = a;
        cout << gcd;
    }else if(b >= a){
        gcd = b;
        cout << gcd;
    }
    cin >> rep;
} while(rep == 1);

如果输入8和24,它会给出2作为答案。有人能在我的代码中发现问题吗?

2 个答案:

答案 0 :(得分:0)

问题是算法在第一次测试GCD失败时放弃了。在大多数情况下,找到最大意味着超越一些不起作用的值。在这种情况下,最多8个工作意味着超过3,5和7。

8%24 == 8.因此do循环至少运行一次。 gcd变为3且经过测试,但未均匀分配为8,因此while条件的计算结果为false。然后3 - 1(2)将流式传输到cout。但是,这不是正确的GCD。

您可以修改算法以从2个输入中的较小者开始,向下工作直到成功(此处为8),然后失败(此处为7)。

答案 1 :(得分:0)

GCD算法的核心只有3行,其余用于防止愚蠢。

#include <stdio.h>

unsigned GCD(unsigned x, unsigned y) {
    unsigned z;
    if (x < y) {
        z = x;                  // swap
        x = y;
        y = z;
    }
    if (y == 0)
        return 0;
    while (z = x % y) {         // perform the GCD with implicit 0 test
        x = y;
        y = z;
    }
    return y;
}

int main(void)
{
    printf("GCD of %u, %u = %u\n", 1, 0, GCD(1, 0));    // billed as C
    printf("GCD of %u, %u = %u\n", 0, 1, GCD(0, 1));
    printf("GCD of %u, %u = %u\n", 1, 1, GCD(1, 1));
    printf("GCD of %u, %u = %u\n", 8, 24, GCD(8, 24));
    return 0;
}

节目输出:

GCD of 1, 0 = 0
GCD of 0, 1 = 0
GCD of 1, 1 = 1
GCD of 8, 24 = 8