#31892: python簡單明瞭解法!!!


allen885566@gmail.com (謝亞倫)

學校 : 不指定學校
編號 : 194549
來源 : [111.240.115.107]
最後登入時間 :
2023-09-28 15:32:54
a013. 羅馬數字 -- NPSC 模擬試題 | From: [106.105.26.77] | 發表日期 : 2022-08-26 03:48

把轉換的部分寫成兩個獨立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
 
# Arabic numerals to Roman numerals function

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()是內建函式,用來取絕對值
 
完成!!! 
 
ZeroJudge Forum