羅馬數字轉換
這篇文章會介紹使用 Python 的串列、字典、邏輯判斷...等功能,實現「羅馬數字轉換阿拉伯數字」,以及「阿拉伯數字轉換羅馬數字」的功能。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
關於羅馬數字
羅馬數字共有 7 個:Ⅰ(1)、Ⅴ(5)、Ⅹ(10)、Ⅼ(50)、Ⅽ(100)、Ⅾ(500) 和 Ⅿ(1000),透過七個數字的組合,可以產生任意的自然數 ( 羅馬數字沒有 0 也沒有負數 )
羅馬數字通常使用於「記數」( 因為作為算數會相當麻煩 ),撰寫上必須遵循下列規則:
- 重複次數等於倍數,羅馬數字重複幾次,就表示這個數的幾倍,例如 ⅩⅩⅩ 等於 30。
- 重複次數最多只能 3 次,例如 40 不能表示為 XXXX,而表示為 XL。
- 在比較大的羅馬數字的「右邊」記上比較小的羅馬數字,表示大數字「加」小數字,例如 VI 等於 5+1。
- 在比較大的羅馬數字的「左邊」記上比較小的羅馬數字,表示大數字「減」小數字,例如 IV 等於 5-1。
- 在數字上加橫線,表示乘以一千或乘以一百萬。
羅馬數字對照表
下方列出作為組合使用的羅馬數字對照表:
羅馬數字 | 阿拉伯數字 | 羅馬數字 | 阿拉伯數字 | 羅馬數字 | 阿拉伯數字 | 羅馬數字 | 阿拉伯數字 | |||
---|---|---|---|---|---|---|---|---|---|---|
I | 1 | XI | 11 | XXI | 21 | C | 100 | |||
II | 2 | XII | 12 | XXIX | 29 | CI | 101 | |||
III | 3 | XIII | 13 | XXX | 30 | CC | 200 | |||
IV | 4 | XIV | 14 | XL | 40 | CCC | 300 | |||
V | 5 | XV | 15 | XLVIII | 48 | CD | 400 | |||
VI | 6 | XVI | 16 | IL | 49 | D | 500 | |||
VII | 7 | XVII | 17 | L | 50 | DC | 600 | |||
VIII | 8 | XVIII | 18 | LX | 60 | CM | 900 | |||
IX | 9 | XIX | 19 | XC | 90 | M | 1000 | |||
X | 10 | XX | 20 | XCVIII | 98 | MM | 2000 |
羅馬數字轉換阿拉伯數字
因為羅馬數字只有七個,每個都有對應的阿拉伯數字,所以一開始先建立轉換對照表,接著將輸入的羅馬數字變成串列後並進行「反轉」,從第二個數字開始,讓後面的數字和前面的數字進行比較,如果後面的數字比較小,就讓結果相減 ( 例如 4 為 IV,反轉後變成 VI,I 小於 V,所以讓 V 減 I 就等於 4 ),反之就讓數字相加,最後就能得到轉換後的阿拉伯數字。
table = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000} # 轉換對照表
roman = [i for i in input()] # 將輸入的羅馬數字變成串列
r = roman[::-1] # 反轉串列
output = table[r[0]] # 讓 output 先等於第一個數字
for i in range(1, len(r)): # 從第二個數字開始依序取到最後一個數字
if table[r[i]] < table[r[i-1]]: # 如果後面數字比較小
output = output - table[r[i]] # 讓 output 減去後面的數字
else:
output = output + table[r[i]] # 如果後面數字比較大,讓 output 加上後面的數字
print(output)
# 輸入 IVMVIIMVVMVM 就會得到 3994
阿拉伯數字轉換羅馬數字
阿拉伯數字要轉換為羅馬數字,同樣需要建立一份對照表,這份對照表主要針對 1、4、5、9、10 這幾種比較特別的數字,建立完成後,使用 divmod 求得輸入數字除以對照表中每個數字的「商」和「餘數」,如果求得商,就讓商乘以對照表的數字,餘數就繼續往下除,最後將對應的字串組合,就變成羅馬數字了。
參考:divmod(x, y)
num_table = [
[1000,'M'],
[900,'CM'],
[500,'D'],
[400,'CD'],
[100,'C'],
[90,'XC'],
[50,'L'],
[40,'XL'],
[10,'X'],
[9,'IX'],
[5,'V'],
[4,'IV'],
[1,'I']] # 建立對照表
num = int(input()) # 將輸入的文字轉換成數字
output = '' # 設定輸出的 output 字串
for i in num_table: # 依序判斷對照表中每個數字
a = divmod(num, i[0]) # 取得商 ( a[0] ) 和餘數 ( a[1] )
if a[0]!=0: # 如果 a[0] 不為 0
num = a[1] # 取得餘數繼續往下除
output = output + i[1]*a[0] # 組合字串
print(output)
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~