# 【AC學習筆記】羅馬數字轉換(Integer to Roman) ###### tags: `JavaScript` `AC學習筆記` ## 目標 可以將 1~ 3999 的正整數,轉換為羅馬數字 ## 運用工具 1. [`String.prototype.repeat()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat) 2. [《維基百科 - 羅馬數字》](https://zh.wikipedia.org/wiki/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97) ## Step1.分析羅馬數字規則 1. **羅馬數字**: 首先,總共有7個羅馬數字為,Ⅰ(1),V(5),X(10),L(50),C(100),D(500),M(1000) 2. **右加左減**: 將小的數字放在大的數字右邊表示我們要表達的為左加右,且右加數字不得超過連續三位 EX. 6→Ⅵ 、 23→XXIII, 9則不得寫成VIIII 相反的,將小的數字放在大的數字左邊則表示右減左,且左減數字不得超過一位 EX. 4→IV 、 9→ IX , 8則不得寫成IIX 於是我們大概可以看出羅馬數字是按照每個位數組合而成的,例如: ``` 2439 = MM(2000) + CD(400) + XXX(30) + IX(9) ``` ## Step2.設計資料結構及演算法 透過前面提到的規則我們找到了13種符號來組合出所有的數字,如下: ``` 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) ``` 接下來我們可以使用Array或Object來存放數字及符號,這裡我是使用Array ``` const num = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1] const symbol = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'] ``` 最後運用迴圈來處理數字就可以啦↓ ``` let roman = "" for (let i = 0; i < num.length; i++) { roman += symbol[i].repeat(Math.floor(number / num[i])) number %= num[i] } ``` ## Step3.封裝成function就完成啦! ```javascript= function toRoman(number){ const num = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1] const symbol = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'] let roman = "" for (let i = 0; i < num.length; i++) { // while (num[i] <= number) { // roman += symbol[i] // number -= num[i] // } roman += symbol[i].repeat(Math.floor(number / num[i])) number %= num[i] if (number === 0) { return roman } } return roman } ``` [完整程式碼連結](https://replit.com/@rz0585720/toRoman-with-test-case-starter#index.js)