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) && (b != 0)
或者正如Cheers and hth. - Alf
建议的那样,只是a && b
。
【讨论】:
为什么不只是a && b
@Cheersandhth.-Alf 这对于新的 C++ 学习者来说可能不太容易阅读/理解。
@abforce 你说得对,我不明白a && b
你能解释一下吗?
当a
和b
都具有非零值时,@DavidLoughnane a && 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);
步骤:
当a
或 b
具有非零值时,a || b
被评估为 true
。
r1
将被转换为整数
true
变为 1
false
变为 0
r1 != 0
被评估并产生一个布尔值(true
或 false
)
while
决定是否循环播放。
【讨论】:
以上是关于c++ 最大公约数的主要内容,如果未能解决你的问题,请参考以下文章