1. 概要
このチュートリアルでは、Javaの数学的アプローチを使用して数値を逆にする方法を説明します。 最初に、これを行うために必要な数学演算を確認し、次にこれを実装する3つの異なる方法を実行します。
2. ソリューションアプローチ
まず、例を見て、何が起こるかを正確に見てみましょう。 たとえば、番号1234を4321にします。 これは、次のアプローチで実現できます。
- 番号の最後の桁を取得します
- モジュラスを適用して最後の桁を取得できます
- 最初の反復– 1234%10 = 4
- 2回目の反復– 123%10 = 3
- 逆の数に10を掛けて、前のステップで見つかった桁を追加します
- 1回目の反復– 0 * 10 + 4 = 4(最初に逆数がないため、1回目の反復で0を掛けます)
- 2回目の反復– 4 * 10 + 3 = 43
- 元の数値を10で割り、手順1から繰り返して、数値が0になるまで続けます。
- 最初の反復– 1234/10 = 123
- 2回目の反復– 123/10 = 12
3. 数学的実装
上記の数学演算をコードに変換したいと思います。 これは、 while ループ、 for ループ、または再帰の3つの異なる方法で可能です。
以下のアプローチは、逆にされる数の絶対値を使用し、元の数が負の場合は逆にされた数に-1を掛けることによって、負の値にも対応します。
3.1. whileループ
while ループは、上記の数学演算を変換する最も明確な方法であるため、リストの最初にあります。
int reversedNumber = 0;
int numberToReverse = Math.abs(number);
while (numberToReverse > 0) {
int mod = numberToReverse % 10;
reversedNumber = reversedNumber * 10 + mod;
numberToReverse /= 10;
}
return number < 0 ? reversedNumber * -1 : reversedNumber;
3.2. forループ
for ループを使用すると、ロジックは以前と同じになります。 for ループの初期化ステートメントをスキップし、終了条件で逆になっている番号を使用します。
int reversedNumber = 0;
int numberToReverse = Math.abs(number);
for (; numberToReverse > 0; numberToReverse /= 10) {
int mod = numberToReverse % 10;
reversedNumber = reversedNumber * 10 + mod;
}
return number < 0 ? reversedNumber * -1 : reversedNumber;
3.3. 再帰
recursion の場合、逆の数を返すrecursiveメソッドを呼び出すラッパーメソッドを使用できます。
int reverseNumberRecWrapper(int number) {
int output = reverseNumberRec(Math.abs(number), 0);
return number < 0 ? output * -1 : output;
}
再帰メソッドは、前の例と同じ方法で数学演算を実装します。
int reverseNumberRec(int numberToReverse, int recursiveReversedNumber) {
if (numberToReverse > 0) {
int mod = numberToReverse % 10;
recursiveReversedNumber = recursiveReversedNumber * 10 + mod;
numberToReverse /= 10;
return reverseNumberRec(numberToReverse, recursiveReversedNumber);
}
return recursiveReversedNumber;
}
recursiveメソッドは、各反復で現在反転されている数値を返し、反転される数値は反復ごとに短縮されます。 これは、反転する数値が0になるまで発生します。0になると、完全に反転した数値が返されます。
4. 結論
この記事では、 while ループ、 for ループ、および再帰を使用して、数値を逆にする3つの異なる実装について説明しました。
いつものように、例のソースコードはGitHubでから入手できます。