【C言語】ローマ数字を10進数に変換するプログラムの作り方
C言語を使用してローマ数字を10進数(アラビア数字)に変換する方法を、アルゴリズム、サンプルコード、実行結果とともに解説します。
ローマ数字の基礎知識
ローマ数字は、以下の7つの記号を組み合わせて数を表現します。
| ローマ数字 | 対応する10進数 |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
基本的には左から順に値を加算していきますが、「IV(4)」や「IX(9)」のように小さな記号が大きな記号の前に置かれた場合は減算を行うというルールがあります。本記事のプログラムも、この減算ルールに対応しています。
ローマ数字を10進数に変換するアルゴリズム
- 処理を開始します。
- 実行時にローマ数字を入力として読み込みます。
- 文字列の長さを取得します(length = strlen(roman))。
- i = 0 から length-1 まで、各文字を switch 文で判定し、対応する数値を配列 d[i] に格納します。
- 'm' / 'M' → d[i] = 1000
- 'd' / 'D' → d[i] = 500
- 'c' / 'C' → d[i] = 100
- 'l' / 'L' → d[i] = 50
- 'x' / 'X' → d[i] = 10
- 'v' / 'V' → d[i] = 5
- 'i' / 'I' → d[i] = 1
- 再び i = 0 から length-1 まで走査し、以下の条件で加算・減算を切り替えます。
- 最後の文字(i == length-1)、または現在の値が次の値以上(d[i] >= d[i+1])の場合 → deci += d[i]
- それ以外の場合 → deci -= d[i]
- ローマ数字の10進数表現を出力します。
- 処理を終了します。
サンプルプログラム
以下が、ローマ数字を10進数に変換するCプログラムです。
#include <stdio.h>
#include <string.h>
int main(void){
char roman[30];
int deci = 0;
int length, i, d[30];
printf("The Roman equivalent to decimal\n");
printf("Decimal:.........Roman\n");
printf("%5d............%3c\n", 1, 'I');
printf("%5d............%3c\n", 5, 'V');
printf("%5d............%3c\n", 10, 'X');
printf("%5d............%3c\n", 50, 'L');
printf("%5d............%3c\n", 100, 'C');
printf("%5d............%3c\n", 500, 'D');
printf("%5d............%3c\n", 1000, 'M');
printf("Enter a Roman numeral:");
scanf("%s", roman);
length = strlen(roman);
/* 各文字を対応する数値に変換 */
for(i = 0; i < length; i++){
switch(roman[i]){
case 'm':
case 'M': d[i] = 1000; break;
case 'd':
case 'D': d[i] = 500; break;
case 'c':
case 'C': d[i] = 100; break;
case 'l':
case 'L': d[i] = 50; break;
case 'x':
case 'X': d[i] = 10; break;
case 'v':
case 'V': d[i] = 5; break;
case 'i':
case 'I': d[i] = 1; break;
}
}
/* 減算ルールを考慮して合計値を計算 */
for(i = 0; i < length; i++){
if(i == length - 1 || d[i] >= d[i+1])
deci += d[i];
else
deci -= d[i];
}
printf("The Decimal equivalent of Roman numeral %s is %d", roman, deci);
return 0;
}
strlen() を使用しているため、移植性を高めるために <string.h> のインクルードを追加しています。
実行結果
上記のプログラムをコンパイルして実行すると、次のような結果が出力されます。
The Roman equivalent to decimal Decimal:.........Roman 1............ I 5............ V 10............ X 50............ L 100............ C 500............ D 1000............ M Enter a Roman numeral: M The Decimal equivalent of Roman Numeral M is 1000
プログラムのポイント
このプログラムの核心は、2つ目の for ループにおける隣接文字の比較処理です。例えば「IX」の場合、先頭の I(1)は次の X(10)より小さいため減算され、最後の X(10)は加算されるので、合計は 9 になります。この仕組みにより、IV(4)、XL(40)、CM(900)といった減算表記もすべて正しく変換できます。
-
Pythonで16進数の文字列を10進数に変換する方法を解説
この記事では、16進数の文字列を10進数に変換する問題の解決策について詳しく解説します。課題の概要16進数形式の文字列が与えられたとき、それを対応する10進数の値に変換することを目標とします。例えば、16進数の「F」は10進数では「15」に相当します。この問題には主に2つのアプローチがあります。力ずく(ブルートフォース)な手法:int関数を使った明示的な型変換組み込みモジュールを活用する手法:astモジュールのliteral_eval関数を使用方法1:int関数を使った変換最もシンプルで一般的な方法は、Pythonの組み込み関数であるint()を利用するものです。この関数は2つの引数を受け取り
-
Pythonで10進数を2進数に変換する方法|再帰処理とbin()関数の実装例
この記事では、「10進数を2進数に変換する」という問題に対する解決策を、具体的なコード例とともにわかりやすく解説します。 問題の概要 問題: 与えられた10進数の整数を、それに対応する2進数表現へ変換する。 この問題を解くには、大きく分けて2つのアプローチがあります。順番に見ていきましょう。 方法1:再帰を使った実装 10進数を2進数に変換する基本的な考え方は、「数値を2で割り続け、その余りを記録する」ことです。再帰関数を使うと、除算を繰り返しながら余りを自動的に上位の桁から順に出力できます。 サンプルコード def DecimalToBinary(num): if num &g