藍橋杯--基礎練習VIP--數的讀法(Python解法及程式碼註釋)
阿新 • • 發佈:2021-01-13
技術標籤:藍橋杯Pythonpython藍橋杯python數的讀法數的讀法python題解藍橋杯
題目
Tom教授正在給研究生講授一門關於基因的課程,有一件事情讓他頗為頭疼:一條染色體上有成千上萬個鹼基對,它們從0開始編號,到幾百萬,幾千萬,甚至上億。
比如說,在對學生講解第1234567009號位置上的鹼基時,光看著數字是很難準確的念出來的。
所以,他迫切地需要一個系統,然後當他輸入12 3456 7009時,會給出相應的念法:
十二億三千四百五十六萬七千零九
用漢語拼音表示為
shi er yi san qian si bai wu shi liu wan qi qian ling jiu這樣他只需要照著念就可以了。
你的任務是幫他設計這樣一個系統:給定一個阿拉伯數字串,你幫他按照中文讀寫的規範轉為漢語拼音字串,相鄰的兩個音節用一個空格符格開。
注意必須嚴格按照規範,比如說“10010”讀作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”讀作“shi wan”而不是“yi shi wan”,“2000”讀作“er qian”而不是“liang qian”。
思路:因為數字從個位到千位,從萬位到千萬位都是一樣的,只不過在後面加上個‘wan’或’yi’。所以將整個字串倒著每四位擷取一次存入一個列表,再寫一個四位數讀法的函式。列表裡的元素依次呼叫numexchange函式,根據位權提前加上"wan"或“yi”,最後再逆序輸出就得到了最終結果。
關於strip()方法:
str.strip()方法就是把這個字串頭和尾的空格,以及位於頭尾的\n \t之類給刪掉
>>> a=" JiaJH "
>>> a.strip()
'JiaJH'
>>> a="\n JiaJH \t "
>>> a.strip()
'JiaJH'
>>> a="Jia JH "
>>> a.strip()
'Jia JH'
>>>
Python程式碼及註釋
d = {'1' :'yi', '2':'er','3':'san','4':'si','5':'wu','6':'liu','7':'qi','8':'ba','9':'jiu','0':'ling'}
n = input().strip()#str.strip()就是把這個字串頭和尾的空格,以及位於頭尾的\n \t之類給刪掉
a = []
b = [] #b存的是逆序的讀法,最後再逆序輸出即為結果
def numexchange(i):
i = i[::-1]
for j in range(len(i)):
if j == 0:
if i[j]!='0':
b.append(d[i[j]])
elif j == 1:
if i[j]=='0' and i[0]!='0':
b.append(d['0'])
elif i[j] == '1' and ( len(i)==2 or i[2] == i[3] == '0'):
b.append('shi')
elif i[j]!='0':
b.append('shi')
b.append(d[i[j]])
elif j == 2:
if i[j]=='0' and i[1]!='0':
b.append(d['0'])
elif i[j]!='0':
b.append('bai')
b.append(d[i[j]])
elif j == 3:
if i[j]!='0':
b.append('qian')
b.append(d[i[j]])
elif i[j]=='0' and i[2]!='0':
b.append(d['0'])
while n!='': #倒著讀,每四位為一組字串
if len(n)>=4:
s = n[-4:] #取後四位
n = n[:-4] #刪除後四位
a.append(s)
else:
a.append(n)
n = ''
for i in range(len(a)):
if i == 0:
numexchange(a[i])
elif i == 1:
b.append('wan')
numexchange(a[i])
elif i == 2:
b.append('yi')
numexchange(a[i])
for i in range(len(b)-1,-1,-1):
if i == len(b)-1:
print(b[i],end='')
else:
print(' %s'%(b[i]),end='')