Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
- 題目大意
將一個整數(shù)轉化為羅馬數(shù)字
對于如何將羅馬數(shù)字轉為整數(shù) 請看這篇
國人可能對于羅馬數(shù)字比較陌生,首先來熟悉一下羅馬數(shù)字的規(guī)則:
羅馬數(shù)字共有7個贰逾,即Ⅰ(1)、Ⅴ(5)巷蚪、Ⅹ(10)圆裕、?(50)绍傲、?(100)、?(500)和?(1000)敷钾。(維基百科)
羅馬數(shù)字 | I | V | X | L | C | D | M |
---|---|---|---|---|---|---|---|
整數(shù) | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
- 一個羅馬數(shù)字重復幾次宣谈,就表示這個數(shù)的幾倍愈犹。最多3次
- 右加左減:
在較大的羅馬數(shù)字的右邊記上較小的羅馬數(shù)字,表示大數(shù)字加小數(shù)字闻丑。
在較大的羅馬數(shù)字的左邊記上較小的羅馬數(shù)字漩怎,表示大數(shù)字減小數(shù)字。V,L,D 不能放在大數(shù)的左邊嗦嗡;左減時不可跨越一個位值勋锤。比如,99不可以用IC表示侥祭,而是用XCIX表示叁执。 - 在羅馬數(shù)字的上方加上一條橫線或者加上下標,表示將這個數(shù)乘以1000矮冬。 (在該題目中用不到谈宛,因為只用考慮4000以內的數(shù)字)
對于左減時不可跨越一個位值,可能比較難理解胎署,具體來說吆录,就是
I只能放在V,X左邊
X只能放在L,C左邊
C只能放在D, M左邊
知道了規(guī)則,再來處理這個問題琼牧。其實難點在于數(shù)字可以放在左邊也可以放在右邊恢筝。 如果都只能放在右邊,就可以直接處理加法了巨坊。好在可以放在左邊情況應該只有6種撬槽,所以我們只需要預先定義好這六種情況:
羅馬數(shù)字 | I | V | X | L | C | D | M | IV | IX | XL | XC | CD | CM |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
整數(shù) | 1 | 5 | 10 | 50 | 100 | 500 | 1000 | 4 | 9 | 40 | 90 | 400 | 900 |
接下來 我們只需要每次選最大的數(shù)字組合起來,將剩下的值重復這個步驟趾撵。
/**
* @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){ //找到剩余數(shù)字可以匹配的最大羅馬數(shù)字
if (roman.num<=num){
break;
}
}
num-=roman.num;
romanNum+=roman.roman;
}
return romanNum;
};