问题:给定一个罗马数字,将其转换成整数。返回的结果要求在1到3999的范围内。
样例
IV
-> 4
XII
-> 12
XXI
-> 21
XCIX
-> 99
首先需要说明罗马数字的原理,如下所示:
罗马数字是阿拉伯数字传入之前使用的一种数码。罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。记数的方法:
-
相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
-
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
-
小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
-
在一个数的上面画一条横线,表示这个数增值 1,000 倍,如
引自
罗马数字_百度百科
根据上面的提示,可以看出,不管是相同的数字还是小的数字在大的数字的右边,都是直接相加,而只有一种是例外,即小的数字在大的数字的左边的情况,因此编程时只需要考虑这一种情况即可。
编程实现代码如下所示:
class Solution {
public:
/**
* @param s Roman representation
* @return an integer
*/
//将单个罗马字符转换为数字
int singleCharToInt(char c)
{
int number = -1;
if (c == 'I')
number = 1;
else if (c == 'X')
number = 10;
else if (c == 'C')
number = 100;
else if (c == 'M')
number = 1000;
else if (c == 'V')
number = 5;
else if (c == 'L')
number = 50;
else if (c == 'D')
number = 500;
return number;
}
int romanToInt(string& s)
{
// Write your code here
char roman[20];
strcpy(roman, s.c_str());
int totalNumber = 0;
for (int i = 0; i < s.size(); i++)
{
int number;
number = singleCharToInt(roman[i]);
//判断是否左边的字符比右边的字符小,如果是,则将该字符代表的数字取反,以达到相减的目的。
if (singleCharToInt(roman[i + 1]) > number)
{
number = -1 * number;
}
totalNumber += number;
}
return totalNumber;
}
};
这里没有考虑到数字上面带横线的情况。这里我自己多实现了一个函数,以达到罗马字符转数字的功能,暂时还不知道有什么其他更简洁的方法。