C++で正の整数を英語の単語表記に変換するプログラムの作成方法
問題の概要
正の整数が与えられたとき、その数値を英語の単語(スペル)に変換することを考えます。例えば、入力が「56」であれば、出力は「Fifty-Six」となります。変換できる範囲は10億(1,000,000,000)までです。
つまり、入力が input = 5678 の場合、出力は「Five Thousand Six Hundred Seventy Eight」になります。
解法のアプローチ
この問題は、数値と対応する英単語のペアを大きな単位から順に配列へ格納し、再帰的に数値を分解していくことで解けます。具体的な手順は以下の通りです。
ステップ1:単語と数値のペア配列「numbers」を定義する
まず、英単語とその対応する数値をペアとして持つ配列「numbers」を、大きい単位から順に定義します。
- {"Billion", 1000000000}
- {"Million", 1000000}
- {"Thousand", 1000}
- {"Hundred", 100}
- {"Ninety", 90}
- {"Eighty", 80}
- {"Seventy", 70}
- {"Sixty", 60}
- {"Fifty", 50}
- {"Forty", 40}
- {"Thirty", 30}
- {"Twenty", 20}
- {"Nineteen", 19}
- {"Eighteen", 18}
- {"Seventeen", 17}
- {"Sixteen", 16}
- {"Fifteen", 15}
- {"Fourteen", 14}
- {"Thirteen", 13}
- {"Twelve", 12}
- {"Eleven", 11}
- {"Ten", 10}
- {"Nine", 9}
- {"Eight", 8}
- {"Seven", 7}
- {"Six", 6}
- {"Five", 5}
- {"Four", 4}
- {"Three", 3}
- {"Two", 2}
- {"One", 1}
ステップ2:再帰関数 solve() を定義する
次に、入力された数値を処理する関数 solve() を以下のように定義します。
- 入力が 0 の場合は「Zero」を返します。
- 配列 numbers の各要素 num について順に調べ、num の2番目の値(数値)が入力以下である場合、次の処理を行います。
- num の2番目の値が 100 以上の場合(Billion/Million/Thousand/Hundred):
result := solve(input ÷ num の2番目の値) + " " + num の1番目の値(単語)とし、さらに余りが存在する場合は result に " " + solve(余り) を連結します。 - それ以外の場合(20〜99など):
result := num.first + (入力が num.second より大きい場合は " " + solve(input − num.second)、そうでなければ空文字列)とします。
- num の2番目の値が 100 以上の場合(Billion/Million/Thousand/Hundred):
- 最後に result を返します。
あとは solve(input) を呼び出すだけで、数値を英語表記に変換できます。
C++での実装例
理解を深めるために、以下の実装例を見てみましょう。
#include<bits/stdc++.h>
using namespace std;
vector<pair<string, int>> numbers{{"Billion", 1000000000},
{"Million", 1000000},
{"Thousand", 1000},
{"Hundred", 100},
{"Ninety", 90},
{"Eighty", 80},
{"Seventy", 70},
{"Sixty", 60},
{"Fifty", 50},
{"Forty", 40},
{"Thirty", 30},
{"Twenty", 20},
{"Nineteen", 19},
{"Eighteen", 18},
{"Seventeen", 17},
{"Sixteen", 16},
{"Fifteen", 15},
{"Fourteen", 14},
{"Thirteen", 13},
{"Twelve", 12},
{"Eleven", 11},
{"Ten", 10},
{"Nine", 9},
{"Eight", 8},
{"Seven", 7},
{"Six", 6},
{"Five", 5},
{"Four", 4},
{"Three", 3},
{"Two", 2},
{"One", 1}};
string solve(int input) {
if (input == 0) return "Zero";
string result;
for (auto& num : numbers) {
if (num.second <= input) {
if (num.second >= 100) {
result = solve(input / num.second) + " " + num.first;
if (input > (input / num.second) * num.second)
result += " " + solve(input - (input / num.second) * num.second);
} else {
result = num.first + (input > num.second ? " " + solve(input - num.second) : "");
}
break;
}
}
return result;
}
int main() {
cout<< solve(5678) <<endl;
return 0;
}入力例
5678
出力例
Five Thousand Six Hundred Seventy Eight
まとめ
このように、数値と英単語の対応表を用意し、大きな桁(Billion → Million → Thousand → Hundred)から順に再帰的に処理することで、10億までの任意の正の整数を英語の単語表記へ変換できます。構造がシンプルなため、桁の扱い方さえ理解すれば、他言語への移植や応用も容易です。
-
数値を逆順に並べ替えるC++プログラムの書き方と解説
数値の反転とは、その桁の数字を逆の順序に並べ替えて格納することを指します。 例えば、元の数値が6529である場合、出力として9256が表示されます。 以下に、数値を反転させるC++プログラムの例を示します。 サンプルプログラム #include <iostream> using namespace std; int main() { int num = 63972, rev = 0; while(num > 0) { rev = rev*10 + num%10; num = num/10; } cout<
-
正の整数のビットを反転するPythonプログラムの書き方
Pythonで正の整数のビット順を逆にするには、まず bin() 関数を使って数値を2進数に変換します。bin() は変換結果の先頭に「0b」というプレフィックスを付加するため、その最初の2文字を除外し、残りの部分を反転させます。さらに、指定されたビットサイズに合わせて、反転した文字列の末尾に0を補完します。最後に、反転した2進数の文字列を整数へと変換し直すことで、ビットが反転された値が得られます。 アルゴリズム integernumber(n, bit_size) /* n は対象の数値、bit_size はビットサイズ */ ステップ1: まず bin() 関数で数値を2進数に変換する。