首页 > 解决方案 > JavaScript 罗马数字转换器

问题描述

我无法正确理解此解决方案。我理解了数组声明部分,但我不确定 while 循环中发生了什么。

function roman(num) {
  var decimalValue = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
  var romanNumeral = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
  var romanized = '';

  for (var index = 0; index < decimalValue.length; index++) {
    while (decimalValue[index] <= num) {
      romanized += romanNumeral[index];
      num -= decimalValue[index];
    }
  }

  return romanized;
}

标签: javascript

解决方案


While 循环从索引零开始到最后一个进行比较,并比较传入的 num 的值是否小于十进制值数组索引处的值,如果是,它将在该处附加(连接)罗马数字随机化的特定索引并从发送的 num 中减去十进制中的等效数字(改变 num 变量)。然后它检查 num 是否仍然大于该特定索引处的值,指示十进制。以 3002 为例。

  1. 首先检查具有 1000 的索引 0 是否小于 3002 true
  2. 在位置索引处将随机化设置为罗马数字。在这种情况下,我们有“M”,然后从 num(3002) 中减去位置索引处的小数,我们现在有 num = 2002。
  3. while 循环再次迭代并检查是否比 2002 少 1000?是的,它会再次执行while循环的主体。
  4. 附加(将位置索引处的值(尚未更改)连接到随机化变量,这种情况下索引仍然为零,所以我们附加'M'现在随机化是'MM'。从num(中减去位置索引(0)处的小数) 2002) 我们现在有 num = 1002。
  5. 迭代while循环并检查decimalValue数组的index(0)位置的十进制值是否小于num(1002),在这种情况下为真。像以前一样执行循环。附加(将位置索引(尚未更改)处的值连接到随机化变量,这种情况下索引仍然为零,所以我们附加'M'现在随机化是'MMM'。从num(中减去位置索引(0)处的小数) 1002) 我们现在有 num = 2。
  6. 迭代while循环并检查decimalValue数组的index(0)位置的十进制值是否小于num(2),false在这种情况下。停止执行循环并在 for 循环中增加 index 的值并再次进行检查。直到你到达终点。

推荐阅读