美文网首页
阿拉伯数字与罗马数字相互转换

阿拉伯数字与罗马数字相互转换

作者: 静候那一米阳光 | 来源:发表于2017-05-22 11:07 被阅读0次

    LeetCode题目:
    Integer to Roman
    Roman to Integer

    罗马数字规则

    罗马数字共有7个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。按照下面的规则可以表示任意正整数。

    • 重复数次:1个罗马数字重复几次,就表示这个数的几倍。
    • 右加左减:在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加小数字。在一个较大的数字的左边记上1个较小的罗马数字,表示大数字减小数字。但是,左减不能跨越一个位数。比如,99不可以用IC表示,而是用XCIX表示。此外,左减数字不能超过1位,比如8写成VIII,而非IIX。同理,右加数字不能超过3位,比如14写成XIV,而非XIIII。
    • 加线乘千:在1个罗马数字的上方加上1条横线或者在右下方写M,表示将这个数字乘以1000,即是原数的1000倍。同理,如果上方有2条横线,即是原数的1000000倍。
    • 单位限制:同样单位只能出现3次,如40不能表示为XXXX,而要表示为XL。但是,由于IV是古罗马神话主神朱庇特(IVPITER,古罗马字母没有J和U)的首字,因此有时用IIII代替IV。

    JavaScript转换算法(适用于1-3999的整数)

    //阿拉伯数字转罗马数字
    var intToRoman = function(num) {
        var Roman = ["I", "V", "X", "L", "C", "D", "M"]; //1,5,10,50,100,500,1000
        var k = 0,
            res = "";
        while (num > 0) {
            var n = num % 10;
            var cur = "";
            if (n <= 3) {
                while (n--) {
                    cur += Roman[2 * k];
                }
            } else if (n == 4) {
                cur += Roman[2 * k] + Roman[2 * k + 1];
            } else if (n <= 8) {
                cur += Roman[2 * k + 1];
                while (--n >= 5) {
                    cur += Roman[2 * k];
                }
            } else if (n == 9) {
                cur += Roman[2 * k] + Roman[2 * (k + 1)];
            }
            res = cur + res;
            num = parseInt(num / 10);
            k++;
        }
        return res;
    };
    //罗马数字转阿拉伯数字
    var romanToInt = function(s) {
        var Roman = ["I", "V", "X", "L", "C", "D", "M"];
        var Int = [1, 5, 10, 50, 100, 500, 1000];
        var res = 0;
        for (var i = 0; i < s.length; i++) {
            var cur = Roman.indexOf(s[i]);
            if (cur % 2 == 0) {
                var next = Roman.indexOf(s[i + 1]);
                if (next - cur == 1 || next - cur == 2) {
                    res += Int[next] - Int[cur];
                    i++;
                } else {
                    res += Int[cur];
                }
            } else {
                res += Int[cur];
            }
        }
        return res;
    };
    for (var i = 1; i <= 3999; i++) {
        var roman = intToRoman(i)
        var int = romanToInt(roman)
        console.log(i, roman, int)
    }
    

    2018.2.6重做补充

    //阿拉伯转罗马数字
    function convertToRoman(num) {
      /*
      1 I
      5 V
      10 X
      50 L
      100 C
      500 D
      1000 M
      */
      var arr = [
        ["I", "V"],
        ["X", "L"],
        ["C", "D"],
        ["M"]
      ];
      var res = [];
      var count = 0;
      while (num > 0) {
        var p = num % 10;
        switch (p) {
          case 0:
            break;
          case 1:
          case 2:
          case 3:
            res.unshift(arr[count][0].repeat(p));
            break;
          case 4:
            res.unshift(arr[count][0] + arr[count][1]);
            break;
          case 5:
            res.unshift(arr[count][1]);
            break;
          case 6:
          case 7:
          case 8:
            res.unshift(arr[count][1] + arr[count][0].repeat(p - 5));
            break;
          case 9:
            res.unshift(arr[count][0] + arr[count + 1][0]);
            break;
          default:
            break;
        }
        num = Math.floor(num / 10);
        count++;
      }
      return res.join("");
    }
    
    console.log(convertToRoman(3999));
    
    

    相关文章

      网友评论

          本文标题:阿拉伯数字与罗马数字相互转换

          本文链接:https://www.haomeiwen.com/subject/rnebxxtx.html