Given a roman numeral, convert it to an integer.
The answer is guaranteed to be within the range from 1 to 3999.
Clarification
Example
IV
-> 4
XII
-> 12
XXI
-> 21
XCIX
-> 99
题意
计数方法:
基本字符 |
I
|
V
|
X
|
L
|
C
|
D
|
M
|
---|---|---|---|---|---|---|---|
相应的阿拉伯数字表示为 |
1
|
5
|
10
|
50
|
100
|
500
|
1000
|
-
相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
-
小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
-
小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
-
正常使用时、连写的数字重复不得超过三次;
-
在一个数的上面画一条横线、表示这个数扩大 1000 倍。
组数规则:
有两条须注意掌握:
-
基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
-
不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;
解法一:
1 class Solution { 2 public: 3 /* 4 * @param s: Roman representation 5 * @return: an integer 6 */ 7 int romanToInt(string s) { 8 int ans = 0; 9 ans = toInt(s[0]); 10 11 for (int i = 1; i < s.length(); i++) { 12 ans += toInt(s[i]); 13 14 if (toInt(s[i-1]) < toInt(s[i])) { 15 ans -= toInt(s[i-1]) * 2; 16 } 17 } 18 19 return ans; 20 } 21 22 int toInt(char s) { 23 switch(s) { 24 case ‘I‘:return 1; 25 case ‘V‘:return 5; 26 case ‘X‘:return 10; 27 case ‘L‘:return 50; 28 case ‘C‘:return 100; 29 case ‘D‘:return 500; 30 case ‘M‘:return 1000; 31 } 32 return 0; 33 } 34 };