罗马数字转换
这篇文章会介绍使用 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)
微信扫码关注
抖音扫码关注