2016-04-25 5 views
0
class GcdCal { 
public: 
    int gcd(int a,int b){ 
     if(a<b){ 
      int temp =a; 
      a = b; 
      b = temp; 
     } 
     int r = a%b; 
     if(r == 0){ 
      cout<< b; 
     }else{ 
      //cout<< b<< " "<< r<<" *** "; 
      gcd(b,r); 
     } 
     return b; 
    } 
}; 

int main() { 
    int a= 44; 
    int b= 16; 
    GcdCal numberTest; 
    int result = numberTest.gcd(a,b); 
    cout<< result; 
    cout<<"gcd is "<<result; 
} 

私はC++の新しい人です。どこが間違っているのか分かりません。gcdプログラムはどのように正しく結果を計算するのですか?

+2

if(r == 0){ cout<< b; }else{ //cout<< b<< " "<< r<<" *** "; gcd(b,r); } return b; 

交換してください。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

本当にこの機能が必要ですか?クラスの一部ですか? _everyhing_をC++のクラスとして実装する必要はありません。 – ForceBru

+0

同じコードを変更しても、実行時に必ずしも同じ出力が得られるわけではありませんか? –

答えて

1

私は結果を返して印刷することから少し混乱していると思います。
この関数は値を返す必要があり、再帰の結果を返す必要があります。そうでない場合は空の偉大なビットバケットに消えます。

int gcd(int a, int b){ 
    if (a < b){ 
     return gcd(b, a); 
    } 
    int r = a % b; 
    if (r == 0) { 
     return b; 
    } else { 
     return gcd(b, r); 
    } 
} 

か、短い:

int gcd(int a, int b){ 
    if (a < b){ 
     return gcd(b, a); 
    } 
    int r = a % b; 
    return r == 0 ? b : gcd(b, r); 
} 

(。注意点として、クラスでその機能を置くことにはポイントがありません)

+0

あなたのコードは本当にエレガントです、助けてくれてありがとう! –

0

再帰が正しく実装されています。最初の反復の結果を返しますが、最後の結果を返す必要があります。あなたのコードをステップ実行するためにデバッガを使用する方法を学ぶ必要があるかもしれないようですね

if(r == 0){ 
    cout<< b; 
    return b; 
}else{ 
    //cout<< b<< " "<< r<<" *** "; 
    return gcd(b,r); 
} 
+0

ありがとうございます!それは多くの助けになります! –

関連する問題