问题:将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