/***********************************************************************
给定一个罗马数字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、正常使用时,连写的数字重复不得超过三次。
***********************************************************************/
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
int romanToInt(string s);
char compare( int temp1, int temp2 );
};
int Solution::romanToInt(string s)
{
int result = 0;
int len = s.size( );
int *data = new int[len];
for( int i = 0; i < len; i++ )
{
switch( s[i] )
{
case ‘I’:data[i] = 1;break;
case ‘V’:data[i] = 5;break;
case ‘X’:data[i] = 10;break;
case ‘L’:data[i] = 50;break;
case ‘C’:data[i] = 100;break;
case ‘D’:data[i] = 500;break;
case ‘M’:data[i] = 1000;break;
}
}
result = data[len-1];
for( int i = len – 1; i >= 1; i– )
{
switch( compare( data[i], data[i-1] ) )
{
case ‘<‘:result = result + data[i-1];break;
case ‘=’:result = result + data[i-1];break;
case ‘>’:result = result – data[i-1];break;
}
}
return result;
}
char Solution::compare( int temp1, int temp2 )
{
if( temp1 < temp2 )
return ‘<‘;
if( temp1 == temp2 )
return ‘=’;
if( temp1 > temp2 )
return ‘>’;
}
int main( int argc, char *argv[] )
{
Solution temp;
int answear = temp.romanToInt( “MDCCCXCIX” );
cout<<“answear = “<<answear<<endl;
system( “pause” );
}