1. 程式人生 > 其它 >藍橋杯--基礎練習VIP--數的讀法(Python解法及程式碼註釋)

藍橋杯--基礎練習VIP--數的讀法(Python解法及程式碼註釋)

技術標籤:藍橋杯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='')