問題:將k進制a轉化成十進制b。
例如:'1101'是2進制,轉成成十進制是1*23+1*22+0*2+1*20=8+4+0+1=13
分析:如果有字母的話,代表是十進制以上。先把字母轉化成相對應的數字。
def get_int(n):
"""
將一個進制中的字母轉化成所代表的數字
:param n:
:return:
"""
upper_num_dic = {chr(i): i - 55 for i in range(65, 91)}
lower_num_dic = {chr(i): i - 87 for i in range(97, 123)}
return upper_num_dic.get(n) or lower_num_dic.get(n)
然后再進行計算,一種朴素的方法是直接乘方,進行計算。
def get_ten_num(k, a): b = 0 # 最后結果 m = 0 # 指數 for i in range(len(a) - 1, -1, -1): n = int(a[i]) if a[i].isdigit() else get_int(a[i]) b += n * (k ** m) # 這里可以使用秦九韶算法優化 m += 1 return b
很容易看出,這里跟求指數之和的算法是一樣的,因此可以使用秦九韶算法,將前面計算的結果保存起來,用於后面的計算。
def get_ten_num1(k, a): """ 使用秦九韶算法優化后的 :param k: :param a: :return: """ b = 0 m = 1 for i in range(len(a) - 1, -1, -1): n = int(a[i]) if a[i].isdigit() else get_int(a[i]) b += n * m m = k * m return b
