C++プログラミング:アラビア数字をローマ数字に変換する

整数をローマ数字に変えるにはどうしたらいいのか?例えば、整数16は、X68000XVIのXVIになる事は往年のX68000ファンには常識だろう。16をXVIに変換するプログラムは、今のプログラミング能力では独力では到底無理なので、このサイトを参考にしつつ作業を始めた。

Arabic numberをRoman numeralにconvertするには、ローマ数字のⅤやⅩ等の数字を下記のようにアラビア数字に対応させる必要がある。

1000,900,500,400,100,90,50,40,10,9,5,4,1
"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"

参考サイトではwhileを羅列してintegerをローマ数字に変換しているが、999と入力すると正しくない数字が返される。もっとスマートなコードを書く必要がある。

整数とローマ数字を対応させるには、vectorかarrayを使えば良いが、vectorを使った場合のコードはpairと組み合わせることで以下のように書ける。

1
2
3
4
  vector<pair<int, string>> introm = {
    {1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"}, {100, "C"}, {90, "XC"},
    {50, "L"}, {40, "XL"}, {10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}
  };

従って、ここまでのコードは以下のように書ける。

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <vector> //vectorを使うのに必要

using namespace std;

string introm(int a) { //整数/ローマ数字変換関数introm

  vector<pair<int, string>> intstr = {
    {1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"}, {100, "C"}, {90, "XC"},
    {50, "L"}, {40, "XL"}, {10, "X"}, {9, "IX"}, {5, "V"}, {4, "IV"}, {1, "I"}
  };

vectorを使いたくない場合はarrayを使って以下のように書ける。

1
2
3
4
5
6
7
#include <iostream>

using namespace std;

string introm(int a){
int intnum[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
const char *romnum[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};

変換したい整数を入力すると、ローマ数字に変換するコードは以下のようになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>

using namespace std;

string introm(int a) {
  int intnum[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
  const char *romnum[] = {"M",  "CM", "D",  "CD", "C",  "XC", "L",
                          "XL", "X",  "IX", "V",  "IV", "I"};

  string s;
  int i = 0;
  while (a) {
    while (a / intnum[i]) {
      s += romnum[i];
      a -= intnum[i];
    }
    i++;
  }
  return s;
}

int main() {
  int a;
  cout << "Enter an integer number:\n";
  cin >> a;
  cout << a << " is " << introm(a) << '\n';
  return 0;
}

このコードを実行するC++ shell

次回はこのコードを少し改良して、0やアルファベット等を入力すると整数を入力するように促すようにしたい。

スポンサーリンク