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;
};