Convert integer to roman numerals - there must be a better way [closed]

自闭症网瘾萝莉.ら 提交于 2019-12-12 03:46:41

问题


I'm working through the intermediate algorithms in the FreeCodeCamp curriculum. One of them involves converting integers to roman numerals. My solution (presented below) works, however it is very much the "naive" approach, if you will. The task hints that array.splice(), array.indexOf(), and array.join() ought to be used. My implementation only uses array.join().

Edited question for precision: Will someone provide an implementation that makes use of all of the aforementioned methods?

Thanks.

My implementation:

function convertToRoman(num) {
  var I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000;
  var numerals = [];
  var i;

  if(num >= 1000){
    var numMs =  Math.floor(num / 1000);
    for (i = 0; i < numMs; i++){
      numerals.push('M');
    }
    num = num % 1000; 
  }

  if(num >= 900){
    numerals.push('CM');
    num = num - 900;
  }

  if(num < 900){
    if(num >= 500){
      numerals.push('D');
      num = num - 500;
    }
    if(num >= 400){
      numerals.push('CD');
      num = num - 400;
    }
    var numCs = Math.floor(num / 100);
    for(i = 0; i < numCs; i++){
      numerals.push('C');
    }
    num = num % 100;
  }

  if(num >= 90){
    numerals.push('XC');
    num = num - 90;
  }

  if(num < 90){
    if(num >= 50){
      numerals.push('L');
      num = num - 50;
    }
    if(num >= 40){
      numerals.push('XL');
      num = num - 40;
    }
    var numXs = Math.floor(num / 10);
    for(i = 0; i < numXs; i++){
      numerals.push('X');
    }
    num = num % 10;
  }

  if(num == 9){
    numerals.push('IX');
    num = num - 9;
  } 

  if(num < 9){
    if(num >= 5){
      numerals.push('V');
      num = num - 5;
    }
    if(num >=4){
      numerals.push('IV');
      num = num - 4;
    }
    var numIs = Math.floor(num / 1);
    for(i = 0; i < numIs; i++){
      numerals.push('I');
    }
  }

  var converted = numerals.join('');

  return converted;
} 

UPDATE: Another answer found here, but it does not use the methods I'm interested in using.


回答1:


You may do as follows;

function toRoman(n){
  var numerals = ["I","V","X","L","C","D","M"];
  return n.toString()
          .split("")
          .reverse()
          .reduce((p,c,i) => (c === "0" ? ""
                                        : c < "4" ? numerals[2*i].repeat(c)
                                                  : c === "4" ? numerals[2*i] + numerals[2*i+1]
                                                              : c < "9" ? numerals[2*i+1] + numerals[2*i].repeat(c-5)
                                                                        : numerals[2*i] + numerals[2*i+2]) + p,"");
}
console.log(toRoman(1453));



回答2:


This is a proposal which use Array#reduce for any part of the number to convert.

function toRoman(i) {
    return ('0000' + i).slice(-4).split('').map(Number).reduce(function (r, a, i) {
        var value = 'MDCLXVI';
        if (a === 4 || a === 9) {
            r += value[i * 2];
            a++;
        }
        if (a === 10) {
            r += value[i * 2 - 2];
            a -= 10;
        }
        if (a >= 5) {
            r += value[i * 2 - 1];
            a -= 5;
        }
        while (a) {
            r += value[i * 2];
            a--;
        }
        return r;
    }, '');
}

var i;
for (i = 1; i <= 3000; i++) {
    document.getElementById('tt').innerHTML += i + ' ' + toRoman(i) + `\n`;
}
<pre id="tt"></pre>


来源:https://stackoverflow.com/questions/40245626/convert-integer-to-roman-numerals-there-must-be-a-better-way

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!