计算将k进制a转化成十进制b。

问题:将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
秦九韶算法优化

 

posted @ 2019-10-18 01:27  walle_zhao  阅读(1181)  评论(0编辑  收藏  举报