Try   HackMD

【AC學習筆記】羅馬數字轉換(Integer to Roman)

tags: JavaScript AC學習筆記

目標

可以將 1~ 3999 的正整數,轉換為羅馬數字

運用工具

  1. String.prototype.repeat()
  2. 《維基百科 - 羅馬數字》

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就完成啦!

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 }

完整程式碼連結