2022年8月16日 星期二

Python a013: 羅馬數字

a013: 羅馬數字

#a013: 羅馬數字

''''

如果生活在數世紀之前的古羅馬,你應該用過 V 來表示五。

V 和 5 這兩個符號都可以用來表示數目五。

用來表示數目的符號稱作數字。

而羅馬人用來表示數目的符號就是羅馬數字。

以下是七個基本的羅馬數字︰


羅馬數字 數目

I 1

V 5

X 10

L 50

C 100

D 500

M 1,000


所有其他的數目都是由這些數字組合而成。

數目都是由左寫到右,通常值是等於組成的羅馬數字加起來。


例如十七可以表示為


 


X+V+I+I=XVII

10+5+1+1=17


表示羅馬數字可以使用減法來取代加法的規則。

例如四可以不用四個一相加來表示 IIII,而採用五減一來表示 IV。

利用這類規則,羅馬人能夠減化許多數目的表示方式,

例如 IX 取代 VIIII 表示 9,及 CD 取代 CCCC 表示 400。

羅馬數字可以很容易地用來相加或相減,但算起乘除法就相當不順手。

這就是為什麼現在羅馬數字並不常用的原因了。


輸入說明

每個輸入檔中會有一個或以上的測試資料。每一行由兩個數字組成一筆測試資料,

且所有數字將會小於4,000。檔案最後會以符號 # 表示結束。


輸出說明

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


範例輸出 #1

I I

MM II

#


範例輸出 #1

ZERO

MCMXCVIII



關於羅馬數字 

羅馬數字共有 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 XLVIII48 CD 400

VI 6 XVI 16 IL 49 D 500

VII 7 XVII 17 L 50 DC 600

VIII 8 XVIII18 LX 60 CM 900

IX 9 XIX 19 XC 90 M 1000

X 10 XX 20 XCVIII98        MM 2000


羅馬數字轉換阿拉伯數字 

因為羅馬數字只有七個,每個都有對應的阿拉伯數字,

所以一開始先建立轉換對照表,接著將輸入的羅馬數字變成串列後並進行「反轉」

,從第二個數字開始,讓後面的數字和前面的數字進行比較,

如果後面的數字比較小,就讓結果相減

( 例如 4 為 IV,反轉後變成 VI,I 小於 V,所以讓 V 減 I 就等於 4 ),

反之就讓數字相加,最後就能得到轉換後的阿拉伯數字。

'''

roma={ "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,

           "LXXX":80,"LXX":70,"ⅮⅭⅭ":700,"ⅮⅭⅭⅭ":800,

           "VIII":8,"XVIII":18,"LX":60,"CM":900,

           "IX":9,"XIX":19,"XC":90,"M":1000,

           "X":10,"XX":20,"XCVIII":98,"MM":2000}



Arabic={ "1":'I',"11":'XI',"21":'XXI',"100":'C',

            "2":'II',"12":'XII',"29":'XXIX',"101":'CI',

            "3":'III',"13":'XIII',"30":'XXX',"200":'CC',

            "4":'IV',"14":'XIV',"40":'XL',"300":'CCC',

            "5":'V',"15":'XV',"48":'XLVIII',"400":'CD',

            "6":'VI',"16":'XVI',"49":'IL',"500":'D',

            "7":'VII',"17":'XVII',"50":'L',"600":'DC',

             "80":'LXXX',"70":'LXX',"700":'ⅮⅭⅭ',"800":'ⅮⅭⅭⅭ',

            "8":'VIII',"18":'XVIII',"60":'LX',"900":'CM',

            "9":'IX' , "19":'XIX', "90":'XC' , "1000": 'M',

           "10":'X',"20":'XX',"98":'XCVIII',"2000":'MM'}


#str1="XC"

#print (roma.get(str1))

flag=1

while (flag==1):

    text_list = input('輸入2組羅馬數字  以符號 # 表示結束-->').split(' ')      # 將輸入的文字使用空白拆分成串列

    array = [str(i) for i in text_list]  # 使用串列生成式,將文字串列轉換成數字串列

    if (array[0]=='#'):

        flag=0

        print('結束程式')

        break

    print(array[0],array[1])

    str1=str(array[0])

    str2=str(array[1])

    Ans=int(roma.get(str1)) -  int(roma.get(str2))

    if (Ans==0):

        print ("ZERO")

    else:

        print(Ans)

        a=int(Ans/1000)

        b=int (Ans/100-a*10)

        c=int(Ans/10-a*100-b*10)

        d=int(Ans-a*1000-b*100-c*10)

        print(a,b,c,d)

        a=str(a*1000)

        b=str(b*100)

        c=str(c*10)

        d=str(d*1)

        print(a,b,c,d)

        if (a=='0'):

            AnsStr1=''

        else:

            AnsStr1=Arabic.get(a)

            

        if (b=='0'):

            AnsStr2='  '

        else:   

            AnsStr2=Arabic.get(b)

        

        if (c=='0'):

            AnsStr3=' '

        else:

            AnsStr3=Arabic.get(c)

        

        if (d=='0'):

            AnsStr4='  '

        else:

            AnsStr4=Arabic.get(d)

        

        

        print(AnsStr1,AnsStr2,AnsStr3,AnsStr4)

        

 


>>> %Run a013.py

輸入2組羅馬數字  以符號 # 表示結束-->MM X

MM X

1990

1 9 9 0

1000 900 90 0

M CM XC   

輸入2組羅馬數字  以符號 # 表示結束-->X I

X I

9

0 0 0 9

0 0 0 9

      IX

輸入2組羅馬數字  以符號 # 表示結束-->

沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...