2011-03-08 17 views
0

私はパラメータとして整数を取って、再帰を使って整数の各桁を二倍にしようとしています。Javaの再帰と整数の二桁

たとえば、doubleDigit(3487)は、33448877を返します。

私が推測する数字の各数字をどのように読み取るのか分かりません。

+3

なぜ再帰を使用したいのですか? – Blorgbeard

答えて

1

これを行うには、モジュラス演算子(%)を毎回10で割って、得られた文字列を後方に累積して、ベースケース(0)に達するまで、分ける余地はありません。基本ケースでは、空の文字列を返します。

String doubleDigit(Integer digit) { 

     if (digit == 0) { 
     return ""; 
     } else { 
     Integer thisDigit = digit % 10; 
     Integer remainingDigits = (digit - thisDigit)/10; 
     return doubleDigit(remainingDigits) + thisDigit.toString() + thisDigit.toString(); 
     } 
    } 
+0

これは完璧です。これはまさに私が探していたものです!どうもありがとうございました!私は通常、コーディングの助けを求めることは決してありませんが、これは私に困ってしまったのです。どうもありがとうございました! – Jeffrey

0

与えられた整数の表現をString.valueOf(doubleDigit)にしてから、Commons StringUtils(私の意見では最も簡単です)を使って文字列を操作できます。

その時点で(新しく作成/操作された文字列ではなく)別の数値を返す必要がある場合は、Integer.valueOf(yourString)などとすることができます。

0

ここで再帰を使う必要はありません。

私はもはやJavaの男だけど、私が使用するアルゴリズムの近似が、この(Javaへの直接変換する必要があり、C#で動作します)です:今動作するものでなければなら

int number = 3487; 
int output = 0; 
int shift = 1; 
while (number > 0) { 
    int digit = number % 10;     // get the least-significant digit  
    output += ((digit*10) + digit) * shift; // double it, shift it, add it to output 
    number /= 10;       // move to the next digit 
    shift *= 100;       // increase the amount we shift by two digits 
} 

このソリューション私はそれを書いているのに苦しんでしまったので、数字を文字列に変換してそれを操作するほうがはっきりと分かりました。もちろん、それは遅くなりますが、あなたはほぼ確実にこのような小さな速度差を気にしないでください:)

編集: [OK]を、あなたは再帰を使用する必要がありますので。あなたはすでに完全に罰金の答えを受け入れたが、ここでは鉱山:)

private static long DoubleDigit(long input) {  
    if (input == 0) return 0;      // don't recurse forever! 
    long digit = input % 10;      // extract right-most digit 
    long doubled = (digit * 10) + digit;   // "double" it 
    long remaining = input/10;     // extract the other digits 
    return doubled + 100*DoubleDigit(remaining); // recurse to get the result 
} 

私はlongに切り替え注ので、それはさらにいくつかの数字で動作します。

+0

残念ながら、私は再帰を使用しなければならず、あなたのコードは完璧です。私はちょうどこれに再帰を使用することを任された:/ – Jeffrey

1

あなたは(基本ケースとして0を想定して、クリスと非常によく似ている)長い文字列の代わりの、あなたは以下の次のソリューションを使用することができ返しソリューションを探しているなら:

long doubleDigit(long amt) { 
    if (amt == 0) return 0;  
    return doubleDigit(amt/10) * 100 + (amt % 10) * 10 + amt % 10;   
} 

この機能はもちろんJavaのmaximum size of a longによって制限されています。

0

ビルドJavaプログラムの実行時に同じ質問をしました。ここで私の解決策は、負の数と正の数で動作し(0を0に戻します)

public static int doubleDigits(int n) { 
    if (n == 0) { 
     return 0; 
    } else { 
     int lastDigit = n % 10; 
     return 100 * doubleDigits(n/10) + 10 * lastDigit + lastDigit; 
}