给定一个罗马数字s,( I<=s<=MMMCMXCIX)(即1到3999),将罗马数字转换成整数。
如罗马数字I,II,III,IV,V分别代表数字1, 2, 3, 4, 5。格式:
第一行输入一个罗马数字,接下来输出对应的整数。
提示:
首先要来了解一下罗马数字表示法,基本字符有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、正常使用时,连写的数字重复不得超过三次。
样例1
输入:
CXXIII
输出:
123
注:
1、基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
2、不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
3、V 和X 左边的小数字只能用Ⅰ。
4、L 和C 左边的小数字只能用X。
5、D 和M 左边的小数字只能用C。
I | IV | 4 | IX | 9 |
X | XL | 40 | XC | 90 |
C | CD | 400 | CM | 900 |
一个字符一个字符的向后计算。
#include<stdio.h>
#include<string.h>
int main(int argc, char **argv)
{
char s[100];
int i,len,count=0;
scanf("%s",&s);
len= strlen(s);
for(i=0;i<len;i++)
{
switch(s[i])
{
case 'M':
count+=1000;
break;
case 'D':
count+=500;
break;
case 'C':
if(s[i+1]=='D'||s[i+1]=='M')
count-=100;
else
count+=100;
break;
case 'L':
count+=50;
break;
case 'X':
if(s[i+1]=='L'||s[i+1]=='C')
count-=10;
else
count+=10;
break;
case 'V':
count+=5;
break;
case 'I':
if(s[i+1]=='V'||s[i+1]=='X')
count--;
else
count++;
break;
default:
printf("error!\n");
}
}
printf("%d\n",count);
return 0;
}