2011-09-25 110 views
6

我已经开始这个程序来计算最大公约数。这是我迄今为止:C++程序计算最大公约数

#include <iostream> 
#include <math.h> 
using namespace std; 
int getGCD(int a, int b) 
{ 
    a = a % b; 
    if (a == 0) 
    { 
     return b; 
     b = b % a; 
    } 
    if (b == 0) 
    { 
     return a; 
    } 
} 
int main() 

{ 
    int x, y; 
    cout << "Please enter two integers x and y, for GCD calculation" << endl; 
    cin >> x >> y; 
    cout << "The GCD of " << x << "and " << y << " is" << getGCD(x, y) << endl; 
    return 0; 
} 

我总是得到0为GCD。我究竟做错了什么?

+1

B =%A;永远不会执行 – Mikhail

+0

检查行返回b;并问自己,该程序如何执行b = b%a;如果你之前告诉它退出此功能。 – dowhilefor

+0

如果这是作业,您应该添加相应的标签:) –

回答

2

你应该循环找到它,如果你用一些方程式来说明你的算法应该如何工作,这可能会有所帮助。

但你有两个问题我看到,除非你在另一个循环内调用它。

你在这两种情况下返回,要么是否则,所以你只能经过这里一次。

此外,这部分没有意义,为什么在做return后修改b值?

  return b; 

      b = b%a; 

你应该为此使用递归,顺便说一句。

http://rosettacode.org/wiki/Greatest_common_divisor#Recursive_Euclid_algorithm

+2

递归不应该用于这个。找到GCD的迭代对于Euclid(*元素*大约公元前300年,第七卷,命题1和2)来说足够好,对你来说这已经足够了。 –

+0

@EricPostpischil - 我相信递归使得一个更简单的解决方案成为可能,但最终取决于OP想要做什么,我只是给出了我的观点,并提供了一个链接来帮助。 –

2
int getGCD(int a, int b) { 

//这里我们需要检查。如果B == 0回报

if (b == 0) { 
     return a; 
    } 
    return gcd(b, a % b); 
} 

欧几里德的算法实现

+0

该控件可能会达到非void函数的末尾。 –

+0

行b = a%b应该是a = a%b,反之亦然 – muhammedabuali