转换罗马数字

基本思路:
由于最大单位为由M表示的1000,所以千、百、十、个的各个数值均有有限的固定组合且数量不大。
进而1000以下的组合可通过查表拼接完成转换,1000以上部分可通过动态生成重复M的拼接。

首先通过取余循环分离各位数字,而后计算索引值并查表取出对应字符串进行拼接,最后返回结果

JS实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    function convert(num) {
var rest = num;
var numArr = [];
var table = {
0:'',

1:'I', 2:'II', 3:'III', 4:'IV', 5:'V',
6:'VI', 7:'VII', 8:'VIII', 9:'IX',

10: 'X', 20:'XX', 30:'XXX', 40:'XL', 50:'L',
60:'LX', 70:'LXX', 80: 'LXXX', 90: 'XC',

100:'C', 200: 'CC', 300:'CCC', 400: 'CD', 500:'D',
600:'DC', 700:'DCC', 800: 'DCCC', 900: 'CM',

1000:'M'
};
//分离各位数字
while(rest > 0){
numArr.push(Math.floor(rest % 10));
rest = Math.floor(rest / 10);
}
console.log(numArr);
var result = numArr.reduce(function(str, val, index){
//index代表原始数据从个位起索引
if (index < 3){
//1000以下部分查表转换并拼接
return table[val*Math.pow(10,index)] + str;
}else{
//1000以上部分动态生成
var unit = table[1000].repeat(Math.pow(10,index-3));
return unit.repeat(val) + str;
}
}, '');
console.log(result);
return result;
}

//test case
console.assert(convert(2)==="II");
console.assert(convert(9)==="IX");
console.assert(convert(12)==="XII");
console.assert(convert(29)==="XXIX");
console.assert(convert(500)==="D");
console.assert(convert(501)==="DI");
console.assert(convert(649)==="DCXLIX");
console.assert(convert(891)==="DCCCXCI");
console.assert(convert(999)==="CMXCIX");
console.assert(convert(1000)==="M");
console.assert(convert(1004)==="MIV");
console.assert(convert(2017)==="MMXVII");
console.assert(convert(3999)==="MMMCMXCIX");
console.assert(convert(10000)==="MMMMMMMMMM");
console.assert(convert(16234)==="MMMMMMMMMMMMMMMMCCXXXIV");
console.assert(convert(316234)==="MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCXXXIV");

参考资料:Roman Numerals

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信