整数转罗马数字

题目
罗马数字包含以下七种数字:I(1), V(5), X(10), L(50), C(100), D(500), M(1000);
那么除了这七种数值可以直接表示外,其他的数值是怎么表示的呢?例如:
数值2: II (两个 I 并列);同理,数字3也一样是三个并列
数字7: VII(一个 V 和两个 I 并列)
数值20: XX (两个 X 并列);同理,数字30也一样是三个并列
数值200:CCC(三个 C 并列);同理,数字3000也一样是三个并列

通常情况下,罗马数字中小的数字放在大的数字右边,即组成一个相加的整数值;但是也有特例,如 4、9、40、90、400、900;并且特殊的规则只有这 6 种情况:

  • I 可以放在 V(5)X(10) 的左边,即表示 IV(4)IX(9)
  • X 可以放在 L(50)C(100) 的左边,即表示 XL(40)XC(90)
  • C 可以放在 D(500)M(1000)的左边,即表示 CD(400)CM(900)

那么,在满足以上条件的情况下,给定一个整数,将其抓换成罗马数字;并保证数字在 [1 - 3999] 内。

示例1

1
2
输入:3
输出:'III'

示例2

1
2
输入:59
输出:'LVIIII'

示例3

1
2
输入:1993
输出:'MCMXCIII'

CODE
通过前面的示例及对罗马数字的理解,在进行转换的途中,可以将数字分为个、十、百、千四个位数来进行处理,分别将其对应成各自组别的数字;即:

1
2
3
4
5
6
7
8
9
10
function initNumToRoman(num) {
const mArr = ['', 'M', 'MM', 'MMM'],
cArr = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'],
xArr = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
iArr = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];

if (num < 1 || num > 3999) return;

return mArr[parseInt(num / 1000)] + cArr[parseInt(num / 100) % 10] + xArr[parseInt(num / 10) % 10] + iArr(num % 10);
}

总结
从整数数字转罗马数字的过程中看出,需要对罗马数字有一个具体的了解,并且罗马数字除了正常的由7种字符表示外,还有6种特殊的规则表示6个对应的特殊数字,其他的都按照规则依次处理即可;最后将数字从千、百、十、个位进行数字计算处理得到最终的结果。