2010-12-13 24 views
-1

たとえばn = 8135267 => 16 これは解決策ですが、わかりません。整数の奇数桁を合計する再帰関数

int sumOddDigits(int n) { 

if(n == 0) 
    return 0; 

if(n%2 == 1) //if n is odd 
    //returns last digit of n + sumOddDigits(n/10) => n/10 removes the last digit of n 
    return n % 10 + sumOddDigits(n/10) 

else 
    return sumOddDigits(n/10); 

} 
+0

コードは明確でシンプルです。あなたの質問は何ですか? – TonyK

+0

小さい数字を選んでこれを紙の上を歩いてください。本当に、それはあなたがここで得ることができる説明と同じくらい明確になるでしょう。 –

+0

デバッガで段階的に実行しようとしましたが、何が起こったのか見てきましたか? –

答えて

2

10桁の整数除算が最後の桁を切り捨てます。 1234/10の結果は123となります。

モジュロ10は最後の桁を返します。つまり、1234%10の結果は4になります。

したがって、上記のコードでは、常に最後の数字が考慮されます。最後の桁が奇数の場合(したがって%2==1のもの)、それ以外の場合はカウントされます。したがって、数字をカウントする必要がある場合は、最後の数字(% 10 -stuff)を取り、残りの数字(/10 -stuffの再帰)で計算を続け、数字に加算します。現在の桁がカウントされない場合、それは現在の桁に加算されずに残りの桁(したがって再帰と/10)のものだけで継続されます。

引数が0の場合、このは、このように関数はそれをこのように考えて0

0

はそれについてこのように考える:8135267 => 16あなたの知ら答えを開始し、私はあなたが何をしなり、* 8135267 * 3に奇数桁の合計のためにあなたを依頼された場合? * 4 * 8135267を求めたらどうなりますか?どのように手動でその機能に関連するステップはありますか?

1

%は、modulo演算子です。基本的には、残りの部分を数値で割ります。

n%2nは、それが奇妙な場合は1にすぎません。 %10は数字を10で割った残りの値を取得します。これは現在の最後の数字を取得します。 10で整数除算すると、現在の最後の桁(1567/10 = 156)として次の桁が得られます。

0

を返して終了し、全体の数が横断していることを意味します。偶数桁を取得すると、関数はその桁の数値の関数値を返します。それ以外の場合は、最後の桁のない数値の関数値を返します。あなたの例:

813526(7) -> 0 + sumEvenDigits(813526) 
         6 + sumEvenDigits(81352) 
           2 + sumEvenDigits(8135) 
              .... 
              8 + sumEvenDigits(0) 
                 0 = 16 

これは役に立ちます。

+0

あなたは奇数ではなく偶数桁を追加しました(この場合、 )。 – caf

+0

ありがとう、私はそれを編集しますが、ポイントはまだ立っています。 – Chris