https://www.freecodecamp.cn/challenges/roman-numeral-converter

将给定的数字转换成罗马数字。

所有返回的 罗马数字 都应该是大写形式。

如果你被难住了,记得使用 Read-Search-Ask尝试与他人结伴编程、编写你自己的代码。

这是一些对你有帮助的资源:

Roman Numerals

Array.splice()

Array.indexOf()

Array.join()

思路

将给定数字转换成罗马数字,为了便于计算,大体思路是把传进来的数值和数组联系起来,经过系列操作后,最后转换成字符串。

单个罗马数字格式有一些规则:

当一个罗马数字符号出现在比它更大的数字的右边时,要把它们加起来得到最终结果数字。

例如: VI = V + I = 5 + 1 = 6

当一个罗马数字符号出现在比它更大的数字的左边时,要把它们相减得到最终结果数字。

例如: IX = X - I = 10 - 1 = 9

同一个罗马数字内部不能包含3个以上相同字符。

例如: IIII 是非法的,表示4应用 IV 。

摘录了一些代码中可能用到的罗马数字与阿拉伯数字对应关系,如下表所示:

I IV V IX X XL L XC C CD D CM M
1 4 5 9 10 40 50 90 100 400 500 900 1000

观察上表可以想到,创建两个数组,分别放入表中每行内容,依靠其对应关系进行转化。

var nums = [1000,900,500,400,100,90,50,40,10,9,5,4,1];
var romans =["m","cm","d","cd","c","xc","l","xl","x","ix","v","iv","i"];

再看一下资料给定的罗马数字拼接规则:

Break the number into Thousands, Hundreds, Tens and Ones, and write down each in turn.

翻译过来是,把给定数字拆分为千位、百位、十位、个位,然后再由大至小依次进行拼接。

5000以上的罗马数字比较特殊,很少用到,本题中不予讨论。

因为多位罗马数字是高位到低位,因此我们创建的两个数组最好也是由大到小,先讨论高位,再讨论低位。

声明一个空字符串,以便写入罗马字符串的拼接。

var str = ‘’; 对 nums 的每一项进行遍历,每当传入的 num 值大于或等于当前项时,将其对应的罗马数字推入之前声明的字符串,并把 num 值减去当前符合条件的数值。

nums.forEach(function(item,index,array){
    while(num >= item){
      str += romans[index];
      num -= item;
    }
  });

最后不要忘记把返回结果转为大写哦! 解法:

function convert(num) {
  var nums = [1000,900,500,400,100,90,50,40,10,9,5,4,1];
  var romans =["m","cm","d","cd","c","xc","l","xl","x","ix","v","iv","i"];
  var str = '';
  nums.forEach(function(item,index,array){
    while(num >= item){
      str += romans[index];
      num -= item;
    }
  });
  
 return str.toUpperCase();
}

convert(36);


Demi_YuHongJun

Demi的随笔和技术空间