【问题标题】:c++ Greatest Common Divisorc++ 最大公约数
【发布时间】:2015-03-10 20:14:51
【问题描述】:

我是 C++ 新手,我正在尝试创建一个函数来实现欧几里得算法,该算法返回两个整数输入的最大公约数。

我目前采用的方法总是崩溃 - 你能帮我理解为什么吗?

int main() {    
    int a = 0;
    int b = 0;

    cin >>  a;
    cin >> b;

    do {
        if ( a > b ) a = a % b;
        else if ( a < b ) b = b % a;
        else if ( a == b ) break;
    } while ( ( a || b ) != 0 ); 

    return 0;
}

谢谢,

大卫

【问题讨论】:

    标签: c++ algorithm do-while modulus


    【解决方案1】:
    while ( ( a || b ) != 0 ); 
    

    这是错误的。应该是

    while ( a != 0 && b != 0 ); 
    

    顺便说一句,欧几里得算法可以简洁地递归实现:

    int gcd(int a, int b)
    {
       return b == 0 ? a : gcd(b, a%b);
    }
    

    【讨论】:

    【解决方案2】:

    您的任期 ( a || b ) != 0 不会像您预期的那样解决。
    你想做的是(a != 0) &amp;&amp; (b != 0)
    或者正如Cheers and hth. - Alf 建议的那样,只是a &amp;&amp; b

    【讨论】:

    • 为什么不只是a &amp;&amp; b
    • @Cheersandhth.-Alf 这对于新的 C++ 学习者来说可能不太容易阅读/理解。
    • @abforce 你说得对,我不明白a &amp;&amp; b 你能解释一下吗?
    • ab 都具有非零值时,@DavidLoughnane a &amp;&amp; b 被评估为true
    【解决方案3】:

    你的 while 条件是错误的。你不能那样简化它。

    while ( ( a || b ) != 0 ); 
    

    它应该看起来像这样。

    while ( ( a != 0 ) && ( b != 0 ) ); 
    

    顺便说一句,您可以采用更简单的方法。像这样的

    int main() {
    
    int a, b, r;
    
    cin >> a;
    cin >> b;
    
    while ( b != 0) {
        r = a % b;
        a = b;
        b = r;
    }
    
    cout << "The GCD is " << a << endl;
    
    }
    

    还有另一种方法,它不需要对算法进行编码。只需使用 libstdc++ 算法库。 Libstdc++

    【讨论】:

    • 制作了相同的程序...您也可以编写 while (b) 而不是 while (b !=0)。但无论哪种方式......欧几里得算法的使用非常酷!
    【解决方案4】:

    让我们仔细看看你的代码,也许你很好奇while ( ( a || b ) != 0 )是做什么的?

    我们现在应该评估( a || b ) != 0。在 C/C++ 中,评估从右到左开始,但 () 具有更高的优先级,因此在运行时我们会:

    bool r1 = a || b;  // intermediate result
    bool r2 = r1 != 0;
    while(r2);
    

    步骤:

    • ab 具有非零值时,a || b 被评估为 true
    • r1 将被转换为整数
      • true 变为 1
      • false 变为 0
    • r1 != 0 被评估并产生一个布尔值(truefalse
    • while 决定是否循环播放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多