2017年12月19日 星期二

a013: 羅馬數字

a013: 羅馬數字
題目: 讀入兩個正整數,輸出兩個數字差的絕對值。所有的數 字都必須以羅馬數字來表示。而連續四個相同符號出現時, 必須用減法規則來化簡之。
 • 輸入說明: 每個輸入檔中會有一個或以上的測試資料。
每一行由兩個數 字組成一筆測試資料,且所有數字將會小於 4000。
檔案最後 會以符號 # 表示結束。

• 輸出說明: 每筆測試資料的答案必須輸出到檔案中,並且換行。
如果答 案為零,則須輸出字串 ZERO。

 • 範例輸入:      範例輸出:
I             I               ZERO
 MM      II              MCMXCVIII
#


# 羅馬數字轉數字
#Given a roman numeral, convert it to an integer.
#Input is guaranteed to be within the range from 1 to 3999.

def romanToInt(s):
    """
    :type s: str
    :rtype: int
    """
    a = {'M': 1000, 'D': 500, 'C': 100, 'L': 50, 'X': 10, 'V': 5, 'I': 1}
    sum = 0
    for i in range(len(s) - 1): #range右邊界len(s) - 1 保證 i + 1不會下標越界
        if a[s[i]] < a[s[i+1]]:
            sum -= a[s[i]]
        else:
            sum += a[s[i]]
    return sum + a[s[len(s) - 1]]


def roman(number):
    ROMANS = (('M',  1000),
          ('CM', 900),
          ('D',  500),
          ('CD', 400),
          ('C',  100),
          ('XC', 90),
          ('L',  50),
          ('XL', 40),
          ('X',  10),
          ('IX', 9),
          ('V',  5),
          ('IV', 4),
          ('I',  1))
   
    result=""

    for roman,value in ROMANS:
        while number>=value:
            number-=value
            result+=roman
    return result




print ("10進制轉羅馬數字")
strX1=str(input("請輸入第一個羅馬數字 :"))
strX2=str(input("請輸入第二個羅馬數字 :"))

intX1=romanToInt(strX1)
intX2=romanToInt(strX2)

intY=abs(intX1-intX2)

strY=roman(intY)

print()
if strY=='' :
    print("Zero")
else:   
    print(strY)



>>> 
====================== RESTART: D:\Python_APSC\a013.py ======================
10進制轉羅馬數字
請輸入第一個羅馬數字 :I
請輸入第二個羅馬數字 :I

Zero
>>> 
====================== RESTART: D:\Python_APSC\a013.py ======================
10進制轉羅馬數字
請輸入第一個羅馬數字 :MM
請輸入第二個羅馬數字 :II

MCMXCVIII
>>> 

沒有留言:

張貼留言

WOKWI ESP32 LED Control , Node-Red MQTT SQLITE  

WOKWI ESP32 LED Control ,  Node-Red  MQTT SQLITE   const char broker[] = "test.mosquitto.org" ; //const char broker[] = "br...