#include "stdafx.h"
#include<string>
#include<iostream>
using namespace std;
int RomanToInt(string s)
{
int res = 0;//初始化结果
int L = s.length();
string str[4];
//string s4, s3, s2, s1;
int i = 0;
//千位
while (s[i] == 'M'&&i<L)
{
str[3] += s[i++];
}
//百位
while (s[i] != 'X'&&s[i] != 'L'&&s[i] != 'I'&&s[i] != 'V'&&i<L)
{
str[2] += s[i++];
}
//十位
while (s[i] != 'I'&&s[i] != 'V'&&i<L)
{
str[1] += s[i++];
}
//各位
while (i < L)
{
str[0] += s[i++];
}
string Roman[4][10] =
{
"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX",
"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC",
"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM",
"", "M", "MM", "MMM"
};
for (int m = 3; m >=0; m--)//从最高位开始匹配
{
res *= 10;
for (int n = 0; n < 10; n++)
{
if (Roman[m][n] == str[m])
{
res += n;
break;
}
}
}
return res;
}
int main()
{
string s;
cin >> s;
cout << RomanToInt(s);
return 0;
}
将罗马数字转换为整数,这一题和上一题的思路差不多,都是按照各位置将书分割开。
稍微有点绕的就是怎样分割开罗马数字。其实将数字写下来,找找规律就能看出来。各位只能由I and v 构成,十位由X和L构成,百位由C和D构成,千位就只能是M了,因为题目限制在1-3999。
将罗马数字分割开,接下来就是在二维数组中进行匹配了。