数値を英語の単語に変換するCプログラムの書き方
数値で構成された文字列が与えられたとき、その数値を英語の単語(スペル表記)へ変換するのが本記事の課題です。
例えば、入力が「361」であれば、出力は「Three hundred sixty one」となるようにします。この問題を解くためには、一の位・十の位・百の位・千の位など、それぞれの数字がどの桁に位置しているのかを意識することが重要です。
なお、今回紹介するコードは最大4桁、つまり0から9999までの数値に対応しています。したがって、入力は0〜9999の範囲である必要があります。
例として「1,111」を考えてみましょう。各桁は以下のように対応します。
- 千の位:1(one thousand)
- 百の位:1(one hundred)
- 十の位:1(10〜19は専用の処理が必要)
- 一の位:1(one)
実行例
入力: "1234" 出力: one thousand two hundred thirty four 入力: "7777" 出力: seven thousand seven hundred seventy seven
問題を解くためのアプローチ
- 入力を文字列として受け取る
- 各種の値に対応する配列を作成する
- 入力の長さを確認し、その長さに応じてどこまでの桁を出力するかを決定する
- 桁の位置に従って出力を行う
アルゴリズム
開始
ステップ1 → 関数 convert(char *num)
int len = strlen(num) を宣言・初期化する
もし len == 0 なら、
fprintf(stderr, "empty string\n") を出力
return
もし len > 4 なら、
fprintf(stderr, "Length more than 4 is not supported\n") を出力
return
char *single_digit[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" } を宣言・初期化
char *tens_place[] = { "", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" } を宣言・初期化
char *tens_multiple[] = { "", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" } を宣言・初期化
char *tens_power[] = { "hundred", "thousand" } を宣言・初期化
num を表示する
もし len == 1 なら、
single_digit[*num - '0'] を表示して return
*num != '\0' の間、以下を繰り返す:
もし len >= 3 なら、
もし *num - '0' != 0 なら、
single_digit[*num - '0'] を表示
tens_power[len-3] を表示(len は 3 または 4)
len を 1 減らす
それ以外の場合、
もし *num == '1' なら、
sum = *num - '0' + *(num + 1) - '0' を設定
tens_place[sum] を表示して return
そうでなく *num == '2' かつ *(num + 1) == '0' なら、
"twenty" を表示して return
それ以外なら、
i = *num - '0' を設定
i ? tens_multiple[i] : "" を表示
num を 1 増やす
もし *num != '0' なら、
single_digit[*num - '0'] を表示
num を 1 増やす
ステップ2 → 関数 main()
convert("9132") を呼び出す
終了C言語による実装例
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 与えられた数値を単語に出力する関数
void convert(char *num) {
int len = strlen(num);
// 各ケースの判定
if (len == 0) {
fprintf(stderr, "empty string\n");
return;
}
if (len > 4) {
fprintf(stderr, "Length more than 4 is not supported\n");
return;
}
// 一桁の数字用の配列
char *single_digit[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
// 先頭の空文字列は、配列のインデックス計算を簡単にするために存在する
char *tens_place[] = {"", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
// 先頭の2つの空文字列は、配列のインデックス計算を簡単にするために存在する
char *tens_multiple[] = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
char *tens_power[] = {"hundred", "thousand"};
// デバッグ用の出力
printf("\n%s: ", num);
// 一桁の数値の場合
if (len == 1) {
printf("%s\n", single_digit[*num - '0']);
return;
}
// num が '\0' になるまで繰り返す
while (*num != '\0') {
// 上位桁(先頭2桁より前)の処理
if (len >= 3) {
if (*num -'0' != 0) {
printf("%s ", single_digit[*num - '0']);
printf("%s ", tens_power[len-3]); // len は 3 または 4
}
--len;
}
// 下位2桁の処理
else {
// 10〜19 は明示的に処理する必要がある。
// 2桁の合計を tens_place 配列のインデックスとして使用
if (*num == '1') {
int sum = *num - '0' + *(num + 1)- '0';
printf("%s\n", tens_place[sum]);
return;
}
// 20 も明示的に処理する
else if (*num == '2' && *(num + 1) == '0') {
printf("twenty\n");
return;
}
// その他の2桁の数値(21〜99)
else {
int i = *num - '0';
printf("%s ", i? tens_multiple[i]: "");
++num;
if (*num != '0')
printf("%s ", single_digit[*num - '0']);
}
}
++num;
}
}
int main() {
convert("9132");
return 0;
}出力結果
nine thousand one hundred thirty two
-
Pythonで指定した数のグレイコードを求めるプログラムの作成方法
グレイコードとは? グレイコード(Gray Code)とは、隣り合う数値同士のビット表現が必ず「ちょうど1ビットだけ」異なるように並べた、二進数の順序付け方式です。デジタル回路やエンコーダなど、誤読を防ぎたい場面で活用されていることで知られています。 グレイコードの一例は次の通りです。[0, 1, 11, 10, 110, 111, …] 問題の定義 ある数 n が与えられたとき、n 番目のグレイコードを求めることを考えます。 例: 入力が n = 12 の場合、出力は 10 になります。これは、12 を二進数で表すと (1100) であり、それに対応するグレイコードは (1010)、その十
-
【Python】数値を各桁のリストに変換する方法を解説
Pythonでデータ処理を行っていると、ある数値を「各桁の数字が要素となったリスト」に変換したい場面に出会うことがあります。例えば、1342という数値を [1, 3, 4, 2] のようなリストにするケースです。この記事では、その実現方法として代表的な2つのアプローチをサンプルコード付きで紹介します。 方法1:リスト内包表記を使う まずstr関数で数値を文字列に変換し、その各文字に対してint関数を適用して整数に戻します。最後に、その結果をリストとしてまとめます。コードが簡潔で読みやすいため、最もよく使われる書き方です。 サンプルコード numA = 1342 # 対象の数値 print(