Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
给定一个罗马数字s,( I<=s<=MMMCMXCIX)(即1到3999),将罗马数字转换成整数。
首先要来了解一下罗马数字表示法,基本字符有7个:I,V,X,L,C,D,M,分别表示1,5,10,50,100,500,1000。
在构成数字的时候,有下列规则:
1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
4、正常使用时,连写的数字重复不得超过三次。
心得:其中在最大的问题是如何对大写字母和数字之间进行一一对应,后来发现从外部定义一个函数convert可以起到类似对应表的效果。
// 字母数字转换
int convert(char c)
{
int ret = 0;
switch(c){
case 'I': ret = 1; break;
case 'V': ret = 5; break;
case 'X': ret = 10; break;
case 'L': ret = 50; break;
case 'C': ret = 100; break;
case 'D': ret = 500; break;
case 'M': ret = 1000; break;
}
return ret;
}
// 所在位置的符号1或-1
int marker(char *s, int pos)
{
int len = strlen(s);
if(pos+1>len-1) return 1;
if(s[pos] == 'I'||s[pos] == 'C'||s[pos] == 'X'){
if(convert(s[pos])<convert(s[pos+1])){
return -1;
}
}
return 1;
}
int romanToInt(char* s) {
int a[7] = {1,5,10,50,100,500,100};
int len =strlen(s);
int i;
int ret =0;
for(i=len-1; i>=0; i--){
int mark = marker(s, i);
ret += mark*convert(s[i]);
}
return ret;
}