LintCode笔记(2)——罗马数字转整数

来源:互联网 发布:黄思路韩寒 知乎 编辑:程序博客网 时间:2024/05/24 22:43

问题:给定一个罗马数字,将其转换成整数。返回的结果要求在1到3999的范围内。

样例

IV -> 4

XII -> 12

XXI -> 21

XCIX -> 99

首先需要说明罗马数字的原理,如下所示:

罗马数字是阿拉伯数字传入之前使用的一种数码。罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。记数的方法:

  1. 相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
  2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
  3. 小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
  4. 在一个数的上面画一条横线,表示这个数增值 1,000 倍,如
    =5000

引自罗马数字_百度百科

根据上面的提示,可以看出,不管是相同的数字还是小的数字在大的数字的右边,都是直接相加,而只有一种是例外,即小的数字在大的数字的左边的情况,因此编程时只需要考虑这一种情况即可。
编程实现代码如下所示:
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 herechar 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;}};

这里没有考虑到数字上面带横线的情况。这里我自己多实现了一个函数,以达到罗马字符转数字的功能,暂时还不知道有什么其他更简洁的方法。

0 0
原创粉丝点击