了解題意
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
將用到以下方法完成計算:
1. Math.floor() => 函式會回傳小於等於所給數字的最大整數。 2. !== => 嚴格的不等於。 3. === => 嚴格的等於。 4. %= => 等同 x = x % y,取餘數。(ex. 2439 / 1000 = 439) 5. for (key in x) & key.repeat => 依序將 x 中的key值帶入迴圈,同時確認key值重複放入次數,並更新至romanNumber=''中。
Let’s imagine we need to convert
( No.1 : 2999 ; No.2 : 0 )
Code 1:
function toRoman(num){ const romanMap = { //宣告羅馬數字的特殊字串對應阿拉伯數字 M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1 } let romanNumber = '' //宣告字串空間 for (let key in romanMap) { let repeatCounter = Math.floor(num / romanMap[key]) //確認num被romanMap[key]整除的次數 if (repeatCounter !== 0) { //如果次數不是「0」 romanNumber += key.repeat(repeatCounter) //則執行取字串*次數 } num %= romanMap[key] // x = x % y 更新num等於餘數 if (num === 0) return romanNumber //如果次數等於「0」,回傳romanNumber=''的值 } return romanNumber }
No.1 驗證「2999」迴圈過程:
迴圈.1 Math.floor(2999 / 1000) = 2 result += M.repeat(2) = MM 2999 = 2999 % 1000 = 999 迴圈.2 Math.floor(999 / 900) = 1 result += CM.repeat(1) = MMCM 999 = 999 % 900 = 99 迴圈.3 Math.floor(99 / 500) = 0 result += D.repeat(0) = MMCM 99 = 99 % 500 = 99 迴圈.4 Math.floor(99 / 400) = 0 result += CD.repeat(0) = MMCM 99 = 99 % 400 = 99 迴圈.5 Math.floor(99 / 100) = 0 result += C.repeat(0) = MMCM 99 = 99 % 100 = 99 迴圈.6 Math.floor(99 / 90) = 1 result += XC.repeat(1) = MMCMXC 99 = 99 % 90 = 9 迴圈.7 Math.floor(9 / 50) = 0 result += L.repeat(0) = MMCMXC 9 = 9 % 50 = 9 迴圈.8 Math.floor(9 / 40) = 0 result += XL.repeat(0) = MMCMXC 9 = 9 % 40 = 9 迴圈.9 Math.floor(9 / 10) = 0 result += X.repeat(0) = MMCMXC 9 = 9 % 10 = 9 迴圈.10 Math.floor(9 / 9) = 1 result += IX.repeat(1) = MMCMXCIX 9 = 9 % 9 = 0 迴圈.11 Math.floor(0 / 5) = 0 result += V.repeat(0) = MMCMXCIX 0 = 0 % 5 = 0 迴圈.12 Math.floor(0 / 4) = 0 result += IV.repeat(0) = MMCMXCIX 0 = 0 % 4 = 0 迴圈.13 Math.floor(0 / 1) = 0 result += I.repeat(0) = MMCMXCIX 0 = 0 % 1 = 0
No.2 驗證「0」迴圈過程:
Math.floor(0 / 1) = 0 result += I.repeat(0) = '' 0 = 0 % 1 = 0
ex. Integer to Roman (點我.replit)
Code 2:
function intToRoman(num: number): string { const romanMap: [string, number][] = [ ["M", 1000], ["CM", 900], ["D", 500], ["CD", 400], ["C", 100], ["XC", 90], ["L", 50], ["XL", 40], ["X", 10], ["IX", 9], ["V", 5], ["IV", 4], ["I", 1], ]; let romanNumber = ""; for (const [symbol, value] of romanMap) { const repeatCounter = Math.floor(num / value); num %= value; romanNumber += symbol.repeat(repeatCounter); if (num === 0) break; } return romanNumber; }