2011-09-25 111 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