Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
Symbol | Value |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
使用羅馬數字來表示整數,例如:7
>> V(5)+II(2)
>> VII
27
>> XX(20)+V(5)+II(2)
>> XXVI
若遇到4
跟9
這兩種數字,表示法會不一樣。4
不會是IIII
,而是IV
,相當於5-1
的意思,9
不會是VIIII
,而是IX
,相當於10-1
的意思,
以此類推,40
>> XL
,90
>> XC
。
輸入的範圍介於1
to 3999
。
Input: 3
Output: III
Input: 4
Output: IV
Input: 9
Output: IX
Input: 58
Output: LVIII
每個符號代表一個數值,這樣的概念類似於另一個經典的練習題:收銀機,找錢時,需要500元幾張,100元幾張,50元幾枚...。
所以我們可以將這些符號當作幣值:
let val = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
let roman = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
假設輸入的參數num
=3999
。
需要MMM(3000
)+CM(900
)+XC(90
)+IX(9
)=MMMCMXCIX
。
符號重複次數 = num / 符號的值
,取商數
。
count = parseInt(num / val[i]);
剩下的數值 = num / 符號的值
,取餘數
。
num = num % val[i];
重複符號該如何串接?
可以使用String API repeat()
。
例如M
要重複3
次:
roman[0].repeat(3);
第一次算出的結果為MMM
,接著取餘數
(999
),再次運算。
這邊就要使用迴圈了,終止條件,以val
的長度為基準。
var intToRoman = function(num) {
let val = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
let roman = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
let romNum = '';
let len = val.length;
for (let i = 0; i < len; i++) {
if (num >= val[i]) {
let count = parseInt(num / val[i]);
num = num % val[i];
romNum += roman[i].repeat(count);
}
}
return romNum;
};