# 【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)