演算法刷題系列(三)藍橋杯python基礎練習4
- 十六進位制轉十進位制
資源限制
時間限制:1.0s 記憶體限制:512.0MB
問題描述
從鍵盤輸入一個不超過8位的正的十六進位制數字符串,將它轉換為正的十進位制數後輸出。
注:十六進位制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。
樣例輸入
FFFF
樣例輸出
65535
- 解答程式
# 十六進位制轉十進位制
temp_dict = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'A':10, 'B':11, 'C':12, 'D':13, 'E' :14, 'F':15}
oxstr = input()
weight = 1
tar = 0
for s in oxstr:
tar = tar * 16 + temp_dict[s]
print(tar)
- 經驗教訓
無。
- 十六進位制轉八進位制
資源限制
時間限制:1.0s 記憶體限制:512.0MB
問題描述
給定n個十六進位制正整數,輸出它們對應的八進位制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由09、大寫字母AF組成的字串,表示要轉換的十六進位制正整數,每個十六進位制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進位制正整數。【注意】
輸入的十六進位制數不會有前導0,比如012A。
輸出的八進位制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進位制數轉換成某進位制數,再由某進位制數轉換成八進位制。
- 解答程式
# 十六進位制轉十進位制
n = int(input())
temp_list =[int(input(), base=16) for i in range(n)]
for i in temp_list:
print("%o" %(i))
- 經驗教訓
**此題非常重要。**最初,我使用的方法是寫了兩個函式,用於先將十六進位制字串轉換為十進位制數,再轉換為八進位制數(程式碼如下)
# 十六進位制轉八進位制
temp_dict = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'A':10, 'B':11, 'C':12, 'D':13, 'E':14, 'F':15}
n = int(input())
def ox2ten(raw_str):
tar = 0
for i in raw_str:
tar = tar * 16 + temp_dict[i]
return tar
def ten2eight(raw_int):
tar_int = ""
while raw_int > 7:
temp = raw_int - raw_int // 8 * 8
tar_int = tar_int * 8 + temp
raw_int = raw_int // 8
else:
tar_int = tar_int * 8 + temp
return tar_int
data_list = [input() for i in range(n)]
tar_list = [ten2eight(ox2ten(i)) for i in data_list]
for i in tar_list:
print(i)
此版本程式碼首先存在最大的問題是:tar_int * 8這一語句塊,事實上,我們是使用十進位制數的形式來表示八進位制數,因此位數的移動在不用位符號的時候應當選擇乘以10。但事實上,每一次的餘數temp應當是新增到tar_int的前面的,這一操作極其複雜。考慮到題目中的輸入十六進位制數可以很大,這裡直接選擇用字串來解決,改進後的程式碼為
def ten2eight(raw_int):
tar_int = ""
while raw_int > 7:
temp = raw_int - raw_int // 8 * 8
tar_int = str(temp) + tar_int
raw_int = raw_int // 8
else:
tar_int = str(raw_int) + tar_int
return tar_int
然而,這種方式執行的程式碼時間執行長度遠遠超過1s,這也是python語言最容易遇到的問題。研究後筆者發現,事實上python的int函式可以直接處理進位制問題。
int(x, base) x為字串或者整數,base為進位制數
但是當x為整數的時候,進位制數引數是被禁用的,也就是說我們無法將十進位制數直接扔進去轉為八進位制數。因此我們還需要用print的格式化輸出
print("%o" %()) %o表示無符號格式化八進位制
於是程式碼被修改為
n = int(input())
temp_list =[int(input(), base=16) for i in range(n)]
for i in temp_list:
print("%o" %(i))
簡潔明瞭,執行時間還只需要31ms。
做此類題目可以明白一定要充分發揮python的優勢,在執行速度方面無法與C,JAVA比較的前提下要儘可能發揮python提供的方法,熟悉python語言的函式是非常重要的。
- 數列排序
資源限制
時間限制:1.0s 記憶體限制:512.0MB
問題描述
給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200
輸入格式
第一行為一個整數n。
第二行包含n個整數,為待排序的數,每個整數的絕對值小於10000。
輸出格式
輸出一行,按從小到大的順序輸出排序後的數列。
樣例輸入
5
8 3 6 4 9
樣例輸出
3 4 6 8 9
- 解答程式
n = int(input())
number_list = list(map(int, input().split()))
number_list.sort()
for i in number_list:
print(i, end=" ")
- 經驗教訓
1、sort函式有兩個引數,key可以提供方法用於選擇排序指標,reverse用於選擇降序還是升序(False)排序.
2、sort函式不提供返回值,本質是list的一個成員方法,內部排序,sorted才提供返回值。
3、鑑於使用到了sort,lambda匿名函式也需要提及。其本質上為
lambda x: g(x) 等價於 func(x):g(x)
4、print函式可以通過end來控制是否換行,以前採用字串拼接後再輸出,這次嘗試了不同的方法。