整数转罗马数字
题目
罗马数字包含以下七种字符: 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
}