用Javascript转换罗马数字的算法

时间:2016-07-30 06:56:30

标签: javascript arrays algorithm

我想实现使用Javascript将罗马数字转换为阿拉伯语的算法。使用以下建议的方法。

  1. Array.prototype.splice()
  2. Array.prototype.indexOf()
  3. Array.prototype.join()
  4. 我已经找到了解决此任务的算法

    function convertToRoman(num) {
    
      var numeric = [ 5000,4000,1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 ];
      var roman = [ 'V\u0305','I\u0305V\u0305','M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I' ];
    
      var output = '', i, len = numeric.length;
    
      for (i = 0; i < len; i++) {
        while (numeric[i] <= num) {
          output += roman[i];
          num -= numeric[i];
        }
      }
    
      return output;
    }
    
    convertToRoman(4999);
    

    然而,我很好奇如何使用上述方法实现算法。

    谢谢,请不要严厉地评判我,我是一名初学程序员。

1 个答案:

答案 0 :(得分:1)

我认为问题已经得到解答:
https://stackoverflow.com/a/9083857/4269495

罗马数字的数字:

Number.prototype.toRoman= function () {
    var num = Math.floor(this), 
        val, s= '', i= 0, 
        v = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1], 
        r = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']; 

    function toBigRoman(n) {
        var ret = '', n1 = '', rem = n;
        while (rem > 1000) {
            var prefix = '', suffix = '', n = rem, s = '' + rem, magnitude = 1;
            while (n > 1000) {
                n /= 1000;
                magnitude *= 1000;
                prefix += '(';
                suffix += ')';
            }
            n1 = Math.floor(n);
            rem = s - (n1 * magnitude);
            ret += prefix + n1.toRoman() + suffix;
        }
        return ret + rem.toRoman();
    }

    if (this - num || num < 1) num = 0;
    if (num > 3999) return toBigRoman(num);

    while (num) {
        val = v[i];
        while (num >= val) {
            num -= val;
            s += r[i];
        }
        ++i;
    }
    return s;
};