Skip to main content

整数转罗马数字

题目

罗马数字包含以下七种字符: I, V, X, L, C, DM.

字符数组
I1
V5
X10
L50
C100
D500
M1000

例如, 罗马数字 2 写做 II, 即为两个并列的 1; 12 写做 XII, 即为 X + II; 27 写做 XXVII, 即为 XX + V + II.

通常情况下, 罗马数字中小的数字在大的数字的右边. 但也存在特例, 例如 4 不写做 IIII, 而是 IV. 数字 1 在数字 5 的左边, 所表示的数等于大数 5 减小数 1 得到的数值 4. 同样地, 数字 9 表示为 IX. 这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5)X (10) 的左边, 来表示 49.
  • X 可以放在 L (50)C (100) 的左边, 来表示 4090.
  • C 可以放在 D (500)M (1000) 的左边, 来表示 400900.

给你一个整数 num, 其中 1 <= num <= 3999, 将其转为罗马数字.

提示:
  • 1 <= num <= 3999
示例
输入: num = 3
输出: 'III'
输入: num = 4
输出: 'IV'
输入: num = 9
输出: 'IX'
输入: num = 58
输出: 'LVIII'
解释: (L = 50), (V = 5), (III = 3)
输入: num = 1994
输出: 'MCMXCIV'
解释: (M = 1000), (CM = 900), (XC = 90), (IV = 4)

题解

建立一个数值 - 符号映射表, 让数值从大到小排列, 遍历该映射表, 若 num 大于等于 value, 让 num 不断减去 value, 并加入该 symbol, 直到 num 小于 value. 如若 num0 了, 就跳出循环.

/**
* @param {number} num
* @return {string}
*/
var intToRoman = function (num) {
const map = [
[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'],
]

let roman = ''
for (const [value, symbol] of map) {
while (num >= value) {
num -= value
roman += symbol
}

if (num === 0) break
}

return roman
}