罗马数字转化器

短命女 2023-06-17 08:55 878阅读 0赞

Roman to Integer

题目要求:
给定一个罗马数字,将其转换为整数。
输入确保在1到3999范围内。
参考链接

罗马数字定义:

  • 罗马数字共有七个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。按照下面的规则可以表示任意正整数。
  • 重复数次:一个罗马数字重复几次,就表示这个数的几倍。
  • 右加左减:
    在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加小数字。
    在一个较大的数字的左边记上一个较小的罗马数字,表示大数字减小数字。
    但是,左减不能跨越等级。比如,99不可以用IC表示,用XCIX表示。
  • 加线乘千:在一个罗马数字的上方加上一条横线或者在右下方写M,表示将这个数字乘以1000,即是原数的1000倍。同理,如果上方有两条横线,即是原数的1000000倍。
  • 单位限制:同样单位只能出现3次,如40不能表示为XXXX,而要表示为XL。

组合规则:
(1) 基本数字 Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
(2) 不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
(3) V 和 X 左边的小数字只能用 Ⅰ。
(4)L 和 C 左边的小数字只能用 ×。
(5)D 和 M 左 边的小数字只能用 C 。

还有一点需要格外注意
MCM是1900
MCMXCVI是1996
按照逻辑 遍历到C 的处理,MC先M+C,但是遍历到第二个M的时候,顺序是CM,这个时候要减去这个C以及之前多加的C,也就是减去两个C。
例子:XCIX 是 99 遍历到第二个X时,+10-2*1

代码实现:

  1. //转化罗马数字为整数
  2. #include <iostream>
  3. #include<string>
  4. #include<stdlib.h>
  5. using namespace std;
  6. class Solution {
  7. public:
  8. //116ms
  9. int romanToInt(string s) { //从左往右
  10. if (s.length() <= 1)
  11. return charToInt(s[0]);
  12. int res = charToInt(s[0]);
  13. for (int i = 1; i<s.length(); i++){
  14. if (charToInt(s[i])>charToInt(s[i - 1]))
  15. res = res + charToInt(s[i]) - 2 * charToInt(s[i - 1]);
  16. else
  17. res += charToInt(s[i]);
  18. }
  19. return res;
  20. }
  21. int charToInt(char s){
  22. switch (s) {
  23. case 'I': return 1;
  24. case 'V': return 5;
  25. case 'X': return 10;
  26. case 'L': return 50;
  27. case 'C': return 100;
  28. case 'D': return 500;
  29. case 'M': return 1000;
  30. default: return 0;
  31. }
  32. }
  33. };
  34. int main()
  35. {
  36. Solution a;
  37. string s;
  38. cin >> s;
  39. cout << a.romanToInt(s) << endl;
  40. system("pause");
  41. return 0;
  42. }

试着将罗马数字从右往左进行转化

  1. //89ms
  2. int romanToInt1(string s) { //从右往左
  3. if(s.length()<=1)
  4. return charToInt(s[0]);
  5. int res = 0;
  6. char maxChar = 'I';
  7. for(int i=s.size()-1; i>=0; --i){
  8. if(charToInt(s[i])>=charToInt(maxChar)){
  9. maxChar = s[i];
  10. res += charToInt(s[i]);
  11. }
  12. else
  13. res -= charToInt(s[i]);
  14. }
  15. return res;
  16. }

效率更高的方法

  • 当利用了罗马数字两个数字前后顺序的关系,也就是说如果是I在V前面,也就是IV,它代表4,反之代表6。再搭配C++的unordered_map,可以巧妙的通过数组来进行判断而达到对ret或加或减的目的。

    //52ms

    include

    int romanToInt2(string s){

    1. unordered_map<char, int> map = { { 'I', 1}, { 'V', 5}, { 'X', 10}, { 'L', 50}, { 'C', 100}, { 'D', 500}, { 'M', 1000}};
    2. int res = 0;
    3. for (int i = 0; i < s.size(); ++i) {
    4. if ((i < s.size()-1) && (map[s[i]] < map[s[i+1]])) {
    5. res -= map[s[i]];
    6. }
    7. else {
    8. res += map[s[i]];
    9. }
    10. }

    return res;
    }

Integer to Roman

整数转化为罗马数字

代码实现:

  1. #include <iostream>
  2. using namespace std;
  3. class Solution {
  4. public:
  5. string intToRoman(int num) { //整数转化为罗马数字
  6. string M[] = { "", "M", "MM", "MMM"};
  7. //1000 - 3000
  8. string C[] = { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
  9. //100 - 900
  10. string X[] = { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
  11. //10 - 90
  12. string I[] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
  13. //0 - 9
  14. return M[num/1000] + C[(num/100)%10] + X[(num/10)%10] + I[num%10];
  15. }
  16. };
  17. int main(){
  18. Solution a;
  19. int num;
  20. cin >> num;
  21. cout << a.intToRoman(num) << endl;
  22. return 0;
  23. }

发表评论

表情:
评论列表 (有 0 条评论,878人围观)

还没有评论,来说两句吧...

相关阅读

    相关 大写罗马数字(大写罗马数字3)

    为什么在罗马数字中没有“0”? 罗马教皇还自己认为用罗马数字来表示任何数字不但完全够用而 且十全十美,他们甚至向外界宣布:“罗马数字是上帝发明的,从今以后不许人们 再随

    相关 罗马数字转化

    Roman to Integer 题目要求: 给定一个罗马数字,将其转换为整数。 输入确保在1到3999范围内。 [参考链接][Link 1] 罗马数字定义

    相关 罗马数字

        古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明

    相关 罗马数字

        古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的

    相关 罗马数字

    我们今日大多数时候习惯于使用阿拉伯数字,但是同时有时候我们还会使用一种数字——罗马数字。传统罗马数字用单个字母表示特定的数值,I表示1,V表示5,X表示10,L表示50,C表示

    相关 罗马数字转换

    给定一个罗马数字 ss,将罗马数字转换成整数。 如罗马数字`I`,`II`,`III`,`IV`,`V`分别代表数字 1, 2, 3, 4, 51,2,3,4,5。 首先要