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組羅馬數字 以符號 # 表示結束-->
沒有留言:
張貼留言