C++でローマ数字を1〜3999の範囲の10進数に変換する方法
このチュートリアルでは、1から3999までの範囲にあるローマ数字を10進数に変換するC++プログラムについて解説します。
具体的には、ランダムなローマ数字が与えられたとき、それを対応する10進数(整数)に変換することを目的とします。
ローマ数字の変換ルール
ローマ数字は以下の7つの記号で構成されています。
- I = 1
- V = 5
- X = 10
- L = 50
- C = 100
- D = 500
- M = 1000
基本的には記号を左から右へ読みながら値を加算していきますが、小さい値が大きい値の前に置かれる場合は減算となります。例えば「IV」は5 - 1 = 4、「CM」は1000 - 100 = 900を表します。
アルゴリズムの考え方
- 文字列を左から順に走査し、各文字に対応する数値を取得します。
- 現在の文字の値が次の文字の値以上であれば、その値を加算します。
- 現在の文字の値が次の文字の値より小さければ、両者の差(次の値 − 現在の値)を加算し、2文字分を処理したものとしてインデックスを進めます。
サンプルコード
#include<bits/stdc++.h>
using namespace std;
// 各ローマ数字の文字に対応する10進数の値を返す
int value(char r){
if (r == 'I')
return 1;
if (r == 'V')
return 5;
if (r == 'X')
return 10;
if (r == 'L')
return 50;
if (r == 'C')
return 100;
if (r == 'D')
return 500;
if (r == 'M')
return 1000;
return -1;
}
// 与えられたローマ数字を10進数に変換する
int convert_decimal(string &str){
int res = 0;
for (int i=0; i<str.length(); i++){
// 現在の文字の値を取得
int s1 = value(str[i]);
if (i+1 < str.length()){
int s2 = value(str[i+1]);
// 減算則が適用されるかどうかを判定
if (s1 >= s2){
res = res + s1;
}
else{
res = res + s2 - s1;
i++;
}
}
else{
res = res + s1;
}
}
return res;
}
int main(){
string str ="MCMIV";
cout << "Integer form:"
<< convert_decimal(str) << endl;
return 0;
}実行結果
Integer form:1904
コードの解説
この例では、入力として「MCMIV」を与えています。これは次のように分解できます。
- M = 1000
- CM = 900(1000 - 100)
- IV = 4(5 - 1)
合計すると 1000 + 900 + 4 = 1904 となり、プログラムの出力と一致します。
value() 関数は各ローマ数字の文字を対応する整数値にマッピングする役割を担い、convert_decimal() 関数が実際の変換ロジックを実装しています。時間計算量は文字列の長さを n とすると O(n) であり、非常に効率的です。
-
C++でオブジェクトを返す方法とは?サンプルコードでわかりやすく解説
オブジェクトとは、クラスから生成される実体(インスタンス)のことです。メモリが割り当てられるのはクラスを定義した時ではなく、オブジェクトを実際に生成した時点です。 C++では、関数内でreturnキーワードを使うことで、オブジェクトをそのまま戻り値として返すことができます。以下に、Pointクラスを使った具体的なサンプルコードを示します。 サンプルコード #include <iostream> using namespace std; class Point { private: int x; int y; public: Point(in
-
C++とC#はどちらが速い?パフォーマンスと特徴を徹底比較
プログラミング言語を選ぶ際、「処理速度」は多くの開発者が気になるポイントです。本記事では、C++とC#という2つの代表的なオブジェクト指向言語を取り上げ、それぞれの特徴や違い、パフォーマンスの差について詳しく解説します。 C++とは C++は中級レベル(ミドルレベル)のプログラミング言語で、1979年にビャーネ・ストロヴストルップ(Bjarne Stroustrup)によって開発されました。C言語を拡張した形であり、低レベルのハードウェア操作から高レベルの抽象化まで幅広く対応できる点が大きな魅力です。オブジェクト指向プログラミングにも完全に対応しています。 C#とは C#は、アンダース・ヘルス