问题描述
给定一个罗马数字 s,将罗马数字转换成整数。
如罗马数字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、相同的数字连写,所表示的数等于这些数字相加得到的数,如:III = 3;
2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:VIII = 8;XII = 12;
3、小的数字,(限于Ⅰ、X和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:IV = 4;IX = 9;
4、正常使用时,连写的数字重复不得超过三次。
补充规则
5、基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
6、不能把基本数字 V 、L 、D 中的任何一个作为小数,放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;
输入格式
输入一个罗马数字字符串,其对应的数字为 s(1≤s≤3999)。
输出格式
输出对应的整数 ss。
样例输入
CXXIII
样例输出
123
C++代码实现
#include <iostream>
#include <malloc.h>
#include <string>
using namespace std;
int main()
{
string s ;//c++中处理字符串时,利用C++自带的string类处理起来很是方便,尤其是在获取实际输入的字符串的长度问题上,
//直接调用string类的length()方法,可以获取输入的字符串长度。
//然而在利用sizeof()或者strlen()时,在C语言环境下使用
//char s[100];
int i,len,count=0;
cin>>s;
//len = sizeof(s)/sizeof(char);
//len = sizeof(s);
len = s.length();
//cout<<len;
for(i = 0;i<len;i++)
{
switch(s[i])
{
case 'M':
count+=1000;//由于输入的范围是固定的,在1到3999,所以,输入的罗马字M(表示1000)的位置肯定是在字符串的最左边,其他字符都是在M的右边。
break;
case 'D':
count+=500;//同理,字符D的右边不可能出现M,所以按照规则6,如果出现在D的左侧,那么结果是DM表示的负数,所以D只能出现在M的右侧,这样才能加上D
break;
case 'C':
if(s[i+1]=='D'||s[i+1]=='M')//表示一旦字符C的右侧出现了字符D和M,那么按照规则6,大的数减去小的数
count-=100;
else
count+=100;
break;
case 'L':
count+=50;//与字符D规则一样
break;
case 'X':
if(s[i+1]=='L'||s[i+1]=='C')//与字符C的规则一样
count-=10;
else
count+=10;
break;
case 'V':
count+=5;//与字符D规则一样
break;
case 'I':
if(s[i+1]=='V'||s[i+1]=='X')//与字符C的规则一样
count--;
else
count++;
break;
default:
cout<<"error"<<endl;
}
}
cout<<count;
return 0;
}