整数转罗马数字
题目
罗马数字包含以下七种字符: I
, V
, X
, L
, C
, D
和 M
.
字符 | 数组 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
例如, 罗马数字 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)
的左边, 来表示4
和9
.X
可以放在L (50)
和C (100)
的左边, 来表示40
和90
.C
可以放在D (500)
和M (1000)
的左边, 来表示400
和900
.
给你一个整数 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
. 如若 num
为 0
了, 就跳出循环.
- JavaScript
- Rust
/**
* @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
}
pub fn int_to_roman(num: i32) -> String {
let mut num = num;
let mut roman = String::from("");
let 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"),
];
for (val, symbol) in map {
while num >= val {
num -= val;
roman += symbol;
}
if num == 0 {
break;
}
}
roman
}