c++ 最大公约数

Posted

技术标签:

【中文标题】c++ 最大公约数【英文标题】:c++ Greatest Common Divisor 【发布时间】: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;

谢谢,

大卫

【问题讨论】:

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

这是错误的。应该是

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

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

int gcd(int a, int b)

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

【讨论】:

nullptr.me/2012/01/07/c-template-metaprogramming 有几个 GCD 实现。也是递归的。【参考方案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 被评估为 truer1 将被转换为整数 true 变为 1 false 变为 0 r1 != 0 被评估并产生一个布尔值(truefalsewhile 决定是否循环播放。

【讨论】:

以上是关于c++ 最大公约数的主要内容,如果未能解决你的问题,请参考以下文章

使用c++求最大公约数与最小公倍数

LeetCode1979. 找出数组的最大公约数(C++)

求两个数的最大公约数(C++)

求两个数的最大公约数(C++)

C++求两个数的最大公约数—更相减损法和枚举法

C++实现求N个数的最大公约数和最小公倍数