const ROMAN_NUMERALS = Object.freeze({
1000: 'M',
900: 'CM',
500: 'D',
400: 'CD',
100: 'C',
90: 'XC',
50: 'L',
40: 'XL',
10: 'X',
9: 'IX',
5: 'V',
4: 'IV',
1: 'I'
});
function convertToRoman(num) {
const digit = Math.max(...Object.keys(ROMAN_NUMERALS).filter(key => num >= key));
if (num === digit) {
return ROMAN_NUMERALS[digit];
}
return ROMAN_NUMERALS[digit] + convertToRoman(num - digit);
}
[
2,
3,
4,
5,
9,
12,
16,
29,
44,
45,
68,
83,
97,
99,
400,
500,
501,
649,
798,
891,
1000,
1004,
1006,
1023,
2014,
3999
].forEach(arg => console.log(arg, convertToRoman(arg)));
Output:
2 II 3 III 4 IV 5 V 9 IX 12 XII 16 XVI 29 XXIX 44 XLIV 45 XLV 68 LXVIII 83 LXXXIII 97 XCVII 99 XCIX 400 CD 500 D 501 DI 649 DCXLIX 798 DCCXCVIII 891 DCCCXCI 1000 M 1004 MIV 1006 MVI 1023 MXXIII 2014 MMXIV 3999 MMMCMXCIX
Another approach:
const ROMAN_NUMERALS = Object.freeze({
M: 1000,
CM: 900,
D: 500,
CD: 400,
C: 100,
XC: 90,
L: 50,
XL: 40,
X: 10,
IX: 9,
V: 5,
IV: 4,
I: 1
})
function convertToRoman(num) {
let rn = '';
for (const [rnLetter, rnValue] of Object.entries(ROMAN_NUMERALS)) {
const q = Math.trunc(num / rnValue);
rn += rnLetter.repeat(q);
num -= q * rnValue;
}
return rn;
}
[
2,
3,
4,
5,
9,
12,
16,
29,
44,
45,
68,
83,
97,
99,
400,
500,
501,
649,
798,
891,
1000,
1004,
1006,
1023,
2014,
3999
].forEach(arg => console.log(arg, convertToRoman(arg)));
Output:
2 II 3 III 4 IV 5 V 9 IX 12 XII 16 XVI 29 XXIX 44 XLIV 45 XLV 68 LXVIII 83 LXXXIII 97 XCVII 99 XCIX 400 CD 500 D 501 DI 649 DCXLIX 798 DCCXCVIII 891 DCCCXCI 1000 M 1004 MIV 1006 MVI 1023 MXXIII 2014 MMXIV 3999 MMMCMXCIX
No comments:
Post a Comment