説明#
ローマ数字には以下の 7 つの文字が含まれます:I
, V
, X
, L
,C
,D
,M
。
文字 数値
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例えば、ローマ数字の 2 はII
と書かれ、1 が 2 つ並んでいることを意味します。12 はXII
と書かれ、X
+ II
となります。27 はXXVII
と書かれ、XX
+ V
+ II
となります。
通常、ローマ数字では小さい数字が大きい数字の右側に配置されます。しかし、特例も存在します。例えば、4 はIIII
ではなくIV
と書かれます。数字 1 は数字 5 の左側にあり、大きい数 5 から小さい数 1 を引いた値である 4 を表します。同様に、数字 9 はIX
と表されます。この特別なルールは以下の 6 つの場合にのみ適用されます:
I
はV
(5)とX
(10)の左側に配置することで、4 と 9 を表します。X
はL
(50)とC
(100)の左側に配置することで、40 と 90 を表します。C
はD
(500)とM
(1000)の左側に配置することで、400 と 900 を表します。
与えられたローマ数字を整数に変換してください。入力は 1 から 3999 の範囲であることが保証されています。
例 1:
入力: "III"
出力: 3
例 2:
入力: "IV"
出力: 4
例 3:
入力: "IX"
出力: 9
例 4:
入力: "LVIII"
出力: 58
説明: L = 50, V= 5, III = 3.
例 5:
入力: "MCMXCIV"
出力: 1994
説明: M = 1000, CM = 900, XC = 90, IV = 4.
アプローチ#
- 文字列の最初から始めて、現在の位が次の位よりも低い場合は、現在の位の値を結果に加算します。そうでない場合は、現在の位の値を減算します。
- これらの 7 つの文字の ASCII 値に基づいて、対応する配列を簡略化し、各文字の位と表す数字を比較するために使用します。実際には、これはハッシュアルゴリズムと同じです。文字をマッピングしてユニークなキーを得るために、文字を 16 進数に変換して & 0XF を取得します。
int romanToInt(char * s){
int nums[15] = {0};
//10進数:16進数:2進数
nums[9] = 1; //I:73:0X49:1001
nums[6] = 5; //V:86:0X56:0110
nums[8] = 10; //X:88:0X58:1000
nums[12] = 50; //L:76:0X4C:1011
nums[3] = 100; //C:67:0X43:0011
nums[4] = 500; //D:68:0X44:0100
nums[13] = 1000;//M:77:0X4D:1101
for(unsigned char i = 0;s[i] != '\0';i++) {
if(nums[s[i] & 0xf] >= nums[s[i+1] & 0xf])
nums[1] += nums[s[i] & 0xf];
else
nums[1] -= nums[s[i] & 0xf];
}
return nums[1];
}
注意事項#
- 現在の位よりも次の位の等級が低い場合にのみ、現在の値を減算します。