C++
 Computer >> コンピューター >  >> プログラミング >> C++

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() を以下のように定義します。

  1. 入力が 0 の場合は「Zero」を返します。
  2. 配列 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)、そうでなければ空文字列)とします。
    その後、ループを抜けます。
  3. 最後に 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億までの任意の正の整数を英語の単語表記へ変換できます。構造がシンプルなため、桁の扱い方さえ理解すれば、他言語への移植や応用も容易です。

  1. 数値を逆順に並べ替える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<

  2. 正の整数のビットを反転するPythonプログラムの書き方

    Pythonで正の整数のビット順を逆にするには、まず bin() 関数を使って数値を2進数に変換します。bin() は変換結果の先頭に「0b」というプレフィックスを付加するため、その最初の2文字を除外し、残りの部分を反転させます。さらに、指定されたビットサイズに合わせて、反転した文字列の末尾に0を補完します。最後に、反転した2進数の文字列を整数へと変換し直すことで、ビットが反転された値が得られます。 アルゴリズム integernumber(n, bit_size) /* n は対象の数値、bit_size はビットサイズ */ ステップ1: まず bin() 関数で数値を2進数に変換する。