C++で数値の桁を反転するプログラムの作成方法【反復・再帰の2つの手法】
数値の桁を反転するプログラムとは、数値を構成する各桁の位置を入れ替え、並び順を逆にする処理を行うものです。
例えば、5桁の数値が「abcde」である場合、反転後は「edcba」になります。
それでは、具体的な例を使って問題を理解してみましょう。
入力
n = 786521
出力
125687
数値の桁を反転するには、元の数値の下の桁(1の位)から順に取り出し、反転結果を格納する変数に追加していきます。処理の流れは以下のとおりです。
- 手順1: n % 10 で最下位桁(1の位)を取り出し、reverseNumber = reverseNumber * 10 + (n % 10) を計算して追加する
- 手順2: 元の数値 n を 10 で割り、次の桁へ移る
- 手順3: n が 0 になるまで手順1〜2を繰り返す
この繰り返し処理は、「反復(ループ)」と「再帰」という2つの方法で実装できます。ここでは、両方の方法を実装したプログラムを紹介します。
例
方法1:反復(ループ)による実装
#include <iostream>
using namespace std;
int reversDigitsIt(int n) {
int reverseNumber = 0;
while(n > 0){
reverseNumber = reverseNumber*10 + n%10;
n /= 10;
}
return reverseNumber;
}
int main() {
int n = 4562;
cout<<"元の数値 : "<<n<<endl;
cout<<"反転後の数値 : "<<reversDigitsIt(n);
return 0;
}
出力
元の数値 : 4562 反転後の数値 : 2654
方法1の解説
whileループの中で、1の位の数字を取り出しては反転用変数の末尾に追加し、元の数値を10で縮めていく処理を繰り返します。最下位桁から順に処理することで、最終的に桁の順序が逆になった数値が得られます。処理回数は桁数に比例するため、計算量は O(log₁₀ n) と非常に効率的です。
例
方法2:再帰による実装
#include <iostream>
using namespace std;
int reverseNumber = 0;
int numPos = 1;
void reversDigitsRec(int n) {
if(n > 0){
reversDigitsRec(n/10);
reverseNumber += (n%10)*numPos;
numPos *= 10;
}
}
int main() {
int n = 4562;
cout<<"元の数値 : "<<n<<endl;
reversDigitsRec(n);
cout<<"反転後の数値 : "<<reverseNumber;
return 0;
}
出力
元の数値 : 4562 反転後の数値 : 2654
方法2の解説
再帰版では、まず n / 10 を引数に自分自身を呼び出し、上位の桁まで処理を進めます。再帰が最深部(最上位桁)に到達した後、呼び出しから戻る際に各桁の数字へ位置の重み(numPos = 1, 10, 100, …)を掛けて加算していくことで、反転した数値が組み上がります。ただし、この実装はグローバル変数に依存しているため、実際の開発では引数と戻り値だけで完結する設計の方が安全で推奨されます。
実装時の注意点
- 末尾が0の数値(例:1200)を反転すると、先頭の0は表現できないため「21」になります。
- 反転後の値が int型の最大値(2,147,483,647)を超える可能性があるため、大きな数値を扱う場合はオーバーフローに注意してください。
- 負の数を扱う場合は、符号部分を事前に取り除いて処理し、後から符号を付け直す必要があります。
-
C言語で配列を逆順に反転させるプログラムの書き方
配列とは、共通の名前のもとで管理される、関連性のあるデータ項目の集まりのことです。同じ型の複数の値を効率的に扱いたい場合に活用されます。配列の宣言構文C言語で配列を宣言する際の基本的な構文は以下のとおりです。データ型 配列名 [サイズ];配列の初期化配列は、宣言と同時に初期化することもできます。int a[5] = { 10,20,30,40,50};この例では、整数型の配列 a の5つの要素に、それぞれ10から50までの値が順番に格納されています。C言語で配列を逆順にする方法配列の要素を逆順に並べ替えるには、要素の入れ替え(スワップ)やコピーのテクニックを利用します。たとえば、4つの要素を持
-
Pythonで数Nの桁数を数えるプログラムの書き方
ある数Nが与えられたとき、その数に含まれる桁の総数を求めることを考えましょう。例えば以下のようなケースです。入力例1:N = 891452出力:6解説: 与えられた数891452は6桁の数字で構成されているため、この場合は「6」を返します。入力例2:N = 0074515出力:5解説: 先頭の0を除いた有効な桁数が5桁であるため、出力は「5」となります。この問題を解くためのアプローチこの問題は、次の手順で解決できます。数値nを入力として受け取ります。関数countDigits(n)が入力nを受け取り、桁数をカウントして返します。数値の各桁に対してループ処理を行い、カウンター変数を1ずつ増加させ