把轉換的部分寫成兩個獨立function
程式結構比較清楚且容易閱讀
# Roman numerals to Arabic numerals function
def RtoA(s):
A={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000} # 建立一個存放對照表的字典
ans=0 # 建立ans整數變數,紀錄答案(Arabic numeral)
for i in range(len(s)):
if i==0:
ans+=A[s[i]]
elif (s[i]=='V' or s[i]=='X') and s[i-1]=='I' or\ # 這裡是Roman numeral轉成Arabic numeral最重要的部分
(s[i]=='L' or s[i]=='C') and s[i-1]=='X' or\ # 也就是判斷Roman numeral中 用減的的部分
(s[i]=='D' or s[i]=='M') and s[i-1]=='C': # 不過相減不能跨級減 也就是說只有 (5-1:IV)(10-1:IX)(50-10:XL)(100-10:XC)(500-100:CD)(1000-100:CM)
ans+=A[s[i]] # 這六種情況
ans-=2*A[s[i-1]] # 因為前面有加過,本來應該用減的,所以這邊減兩次回去
else:
ans+=A[s[i]]
return ans
def AtoR(n):
A=[[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']]
ans='' # 建立ans字串變數,紀錄答案(Roman numeral)
for i in A: # 從大到小判斷,
if n//i[0]:
a,b=divmod(n,i[0])
ans+=i[1]*a # 能取出幾個i[1]加到ans裡,
n=b # 再紀錄n剩下多少,繼續跑對照表下一個項目
return ans
# main
if __name__=='__main__':
while 1:
data=input()
if data=='#':
break
a=data.split()[0]
b=data.split()[1]
if a==b: # 若被減數與減數相同,直接輸出'ZERO'!!!
print('ZERO')
else:
print(AtoR(abs(RtoA(a)-RtoA(b)))) # 註:abs()是內建函式,用來取絕對值
完成!!!