#49787: Python 逐行註解


joejuniorsince2022@gmail.com (Joe Junior Liang)

學校 : 不指定學校
編號 : 249622
來源 : []
最後登入時間 :
2023-09-23 17:22:45

#第一次發文,有誤敬請指教

def
roman_to_int(s: str): #羅馬轉數字(int)
    num_map = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000} #定義字典
    values = [num_map[i] for i in s] #羅馬轉數字(list),例如"XIV"會轉成[10, 1, 5]
    total = 0 #結果數值
    prev = 0 #前一次的暫存數值,計算用
    for val in reversed(values): #reversed()是指從右到左,符合羅馬數字規則習慣
        if val < prev: #如果該項數值小於前一項(prev初始為零)
            total -= val #就前面減後面,如IV即是5-1=4
        else:
            total += val #反之相加,如VI即是5+1=6
        prev = val #更新prev
    return total #回傳結果

def int_to_roman(n: int): #數字轉羅馬
    if n == 0: #結果為零的特例
        return 'ZERO'
    val_map = [
        (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')
    ] #定義轉換表
    result = ""
    for value, symbol in val_map: #依序從表中取數值與符號,重複操作
        while n >= value: #如果數字大於數值
            result += symbol #就插入該符號
            n -= value #然後數字減掉該數值
    return result #回傳結果

#主程式
ques = [] #紀錄題目清單
while True: #重複輸入
    line = input()
    if line == '#': #如果輸入為#就跳出
        break
    ques.append(line) #新增到清單
   
for line in ques: #依序處理清單
    a_str, b_str = line.split(' ') #用空格分割字串
    #轉換成數字
    a_val = roman_to_int(a_str)
    b_val = roman_to_int(b_str)

    diff = abs(a_val - b_val) #計算絕對值
    print(int_to_roman(diff)) #輸出羅馬數字