Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
- 题目大意
将一个整数转化为罗马数字
对于如何将罗马数字转为整数 请看这篇
国人可能对于罗马数字比较陌生,首先来熟悉一下罗马数字的规则:
罗马数字共有7个,即Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500)和Ⅿ(1000)。(维基百科)
罗马数字 | I | V | X | L | C | D | M |
---|---|---|---|---|---|---|---|
整数 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
- 一个罗马数字重复几次,就表示这个数的几倍。最多3次
- 右加左减:
在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。V,L,D 不能放在大数的左边;左减时不可跨越一个位值。比如,99不可以用IC表示,而是用XCIX表示。 - 在罗马数字的上方加上一条横线或者加上下标,表示将这个数乘以1000。 (在该题目中用不到,因为只用考虑4000以内的数字)
对于左减时不可跨越一个位值,可能比较难理解,具体来说,就是
I只能放在V,X左边
X只能放在L,C左边
C只能放在D, M左边
知道了规则,再来处理这个问题。其实难点在于数字可以放在左边也可以放在右边。 如果都只能放在右边,就可以直接处理加法了。好在可以放在左边情况应该只有6种,所以我们只需要预先定义好这六种情况:
罗马数字 | I | V | X | L | C | D | M | IV | IX | XL | XC | CD | CM |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
整数 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 | 4 | 9 | 40 | 90 | 400 | 900 |
接下来 我们只需要每次选最大的数字组合起来,将剩下的值重复这个步骤。
/**
* @param {number} num
* @return {string}
*/
var intToRoman = function (num) {
let romanNum='';
const romanNums = [
{ roman: 'I', num: 1 },
{ roman: 'V', num: 5 },
{ roman: 'X', num: 10 },
{ roman: 'L', num: 50 },
{ roman: 'C', num: 100 },
{ roman: 'D', num: 500 },
{ roman: 'M', num: 1000 },
{ roman: 'IV', num: 4 },
{ roman: 'IX', num: 9 },
{ roman: 'XL', num: 40 },
{ roman: 'XC', num: 90 },
{ roman: 'CD', num: 400 },
{ roman: 'CM', num: 900 }
];
romanNums.sort((a, b) => b.num - a.num); //按照从大到小排序
while (num>0){
let roman;
for (roman of romanNums){ //找到剩余数字可以匹配的最大罗马数字
if (roman.num<=num){
break;
}
}
num-=roman.num;
romanNum+=roman.roman;
}
return romanNum;
};