2011-09-25 5 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; 
} 

私はいつもGCDに0を得ます。私は間違って何をしていますか?

+1

B = Bの%B;実行されません – Mikhail

+0

行の戻り値を確認します。どのようにしてプログラムがb = b%aを実行できるかあなた自身に尋ねてください。前にこの機能から復帰するように指示した場合。 – dowhilefor

+0

これは宿題であれば、あなたはGCDを参照して、楽しみのために適切なタグ:) –

答えて

2

あなたはこれを見つけることをループする必要があり、あなたが入れた場合には、いくつかの方程式で、これがどのように動作するかを、あなたのためのアルゴリズムを助けるかもしれません。

しかし、あなたは別のループのこの内部を呼び出している場合を除き、あなたは、私が見る二つの問題があります。

次の場合や、他のいずれかの、どちらの場合に戻ってきているので、あなたは一度だけ、ここを通過します。

また、この部分は意味をなさない、なぜreturnをやった後b値を変更?

  return b; 

      b = b%a; 

これは再帰を使用する必要があります。

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

+2

これには再帰を使用すべきではありません。 GCDを見つけるための繰り返しは、ユークリッド(*要素* 300 BCE、第Ⅶ章、命題1と2)のために十分であり、あなたにとっては十分です。 –

+0

@EricPostpischil - 再帰はより単純な解決策になりますが、最終的にはOPが何をしたいのかによって異なります。 –

2
int getGCD(int a, int b) { 

は、//ここでは、チェックする必要がある場合は== 0リターン

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

ユークリッドのアルゴリズム実装

+0

コントロールが空でない関数の終わりに達することがあります。 –

+0

線b = a%bはa = a%bでなければならず、その逆も成り立つ – muhammedabuali