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

数値を英語の単語に変換するアルゴリズム


このアルゴリズムは、与えられた数値を英語の単語へ変換するものです。例えば、564という数値は「Five Hundred and Sixty-Four」という文字列に変換されます。

変換処理では、あらかじめ定義された文字列のリストを用意し、そこから適切な単語を取り出しながら数値を言葉に組み立てていきます。用意するリストは次の4種類です。

  • units: 0〜9の数字に対応する単語(Zero、One…Nine)を保持します。
  • twoDigits: 10〜19の数値に対応する単語(Ten、Eleven…Nineteen)を保持します。
  • tenMul: 10の倍数(20〜90)に対応する単語(Twenty、Thirty…Ninety)を保持します。
  • tenPower: 10の2乗・3乗に相当する「Hundred(百)」「Thousand(千)」を保持します。

入力と出力

Input:
The number: 568
Output:
Five Hundred And Sixty Eight

アルゴリズム

numToWord(num)

それぞれの整数に対応する単語を格納した複数のリストを利用します。

入力: 変換対象の数値。

出力: 数値を単語で表現した結果。

Begin
    if n >= 0 and n < 10, then
        units(n) を単語として表示
    else if n >= 10 and n < 20, then
        twoDigitNum(n) を単語として表示    //10から19まで
    else if n >= 20 and n < 100, then
        tensMultiple(n / 10) を単語として表示
        if n mod 10 ≠ 0, then
            numToWord(n mod 10)
    else if n >= 100 and n < 1000, then
        units(n / 100) を単語として表示
        "Hundred" を表示                   //百の位
        if n mod 100 ≠ 0, then
            "And" を表示
            numToWord(n mod 100)
    else if n >= 1000 and n <= 32767, then
        numToWord(n / 1000)
        "Thousand" を表示                  //千の位
        if n mod 1000 ≠ 0, then
            numToWord(n mod 1000)
    else
        無効な数値としてエラーを表示して終了
End

C++による実装例

続いて、このアルゴリズムをC++で実装した例を紹介します。再帰呼び出しを活用することで、各桁の変換処理を簡潔に記述できるのがポイントです。

#include<iostream>
using namespace std;

string getUnit(int n) {
    //1桁の数字を単語として返す
    string unit[10] = {"Zero", "One","Two", "Three","Four","Five", "Six","Seven","Eight","Nine"};
    return unit[n];
}

string getTwoDigits(int n) {
    //nは2桁の数値
    string td[10] = {"Ten", "Eleven","Twelve","Thirteen", "Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
    return td[n%10];
}

string getTenMul(int n) {
    //nは10の倍数
    string tm[8] = {"Twenty", "Thirty","Forty", "Fifty","Sixty", "Seventy","Eighty","Ninety"};
    return tm[n-2];
}

string getTenPow(int pow) {
    //10のべき乗を単語で返す
    string power[2] = {"Hundred", "Thousand"};
    return power[pow-2];
}

void printNumToWord(int n) {
    if(n >= 0 && n < 10)
        cout << getUnit(n) << " ";       //1桁の値を単語に変換
    else if(n >= 10 && n < 20)
        cout << getTwoDigits(n) << " ";  //11から19まで
    else if(n >= 20 && n < 100) {
        cout << getTenMul(n/10)<<" ";
        if(n%10 != 0)
            printNumToWord(n%10);        //数値を単語に変換する再帰呼び出し
    } else if(n >= 100 && n < 1000) {
        cout << getUnit(n/100)<<" ";
        cout << getTenPow(2) << " ";
        if(n%100 != 0) {
            cout << "And ";
            printNumToWord(n%100);
        }
    } else if(n >= 1000 && n <= 32767) {
        printNumToWord(n/1000);
        cout << getTenPow(3)<<" ";
        if(n%1000 != 0)
            printNumToWord(n%1000);
    } else
        printf("Invalid Input");
}

main() {
    int number;
    cout << "Enter a number between 0 to 32767: "; cin >> number;
    printNumToWord(number);
}

実行結果

Enter a number between 0 to 32767: 568
Five Hundred And Sixty Eight

まとめ

このアルゴリズムの要点は、数値の桁数に応じて処理を場合分けし、剰余(mod)の部分を再帰的に変換していく点です。対応範囲は16ビット符号付き整数の最大値に合わせて0〜32767となっていますが、リストに「Million」「Billion」などの単語を追加すれば、より大きな数値にも簡単に拡張できます。

  1. C++で10進数を2進数に変換するプログラムの書き方

    コンピューターの内部では、すべてのデータが2進数(基数2)として扱われています。一方、私たちが日常的に使う10進数は「0〜9」の数字を組み合わせた基数10の記数法です。この記事では、C++を使って入力された10進数を2進数へ変換するプログラムの考え方と実装方法を解説します。10進数から2進数への変換手順10進数を2進数に変換する基本的な方法は、「2で割った余りを順番に記録していく」ものです。具体的には次の手順で行います。まず、変換したい数値を基数である2で割り、商と余りを求めます。余りが0であればその桁は「0」、1であれば「1」として記録します。続いて、得られた商をさらに2で割り、同じように余

  2. Wordでページ番号を追加・削除・カスタマイズする方法【初心者向けガイド】

    Word文書でページ番号の追加や削除、あるいはカスタムページ番号の挿入を行いたい場合は、このチュートリアルをご活用ください。特定の数字からページ番号を開始したい場合でも、ページ番号を完全に非表示にしたい場合でも、ステップバイステップのガイドに従えばすべて実現できます。操作はとても簡単で、サードパーティ製ツールを使う必要もありません。 どのような変更を行う場合でも、まずドキュメント本体の編集を完了させておきましょう。編集中にページ番号を操作すると、トラブルが発生する可能性があります。すでに編集が済んでいる方は、以下のガイドに沿って希望の変更を行ってください。 関連記事:PowerPointのスラ