了解題意
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;
}