Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
class Solution {
public:
int toNUm(char ch)
{
switch(ch)
{
case 'I':return 1;
case 'V':return 5;
case 'X':return 10;
case 'L':return 50;
case 'C':return 100;
case 'D':return 500;
case 'M':return 1000;
default:return 0;
}
}
int romanToInt(string s) {
int num = 0;
for(int i = 0;i<s.size();i++)
{
if(toNUm(s[i])>=toNUm(s[i+1]))
num += toNUm(s[i]);
else
num -= toNUm(s[i]);
}
return num;
}
};
罗马数字
你肯定见过罗马数字,即使你不认识他们。你可能在版权信息、老电影、电视、大学或者图书馆的题词墙看到(用CopyrightMCMXLVI表示版权信息,而不是用?“Copyrigh1946。你也可能在大纲或者目录参考中看到他们。这种系统的数字表达方式可以追溯到罗马帝国(因此而得名)。在罗马数字中,有七个不同的数字可以以不同的方式结合起来表示其他数字。
I=1
V=5
X=10
L=50
C=100
D=500
M=1000
下面是几个通常的规则来构成罗马数字:
大部分时候用字符相叠加来表示数字。I 是1,II 是2,III 是3。VI 是6(挨个看来,是"5和1"的组合)VII 是7,VIII 是8
含有10 的字符(I,X,C 和M)最多可以重复出现三个。为了表示4,必须用同一位数的下一个更大的数字5 来减去一。不能用IIII 来表示4,而应该是IV(意思是比5 小1)。40 写做XL(比50 小10),41 写做 XLI,42 写做XLII,43 写做 XLIII,44 写做XLIV(比50 小10 并且比5 小 1)。
有些时候表示方法恰恰相反。为了表示一个中间的数字,需要从一个最终的值来减。比如:9 需要从10 来减:8 是VIII,但9 确是IX(比10 小1),并不是VIII(I 字符不能重复4 次)。90 是XC,900 是CM。
表示5 的字符不能在一个数字中重复出现。10 只能用X 表示,不能用VV 表示。100 只能用C 表示,而不是LL。
罗马数字是从左到右来计算,因此字符的顺序非常重要。DC表示600,而CD 完全是另一个数字400(比500 小100)。CI是101,IC 不是一个罗马数字(因为你不能从100 减1,你只能写成XCIX,表示比100 小10,且比10 小1)。