• 计算将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
    秦九韶算法优化
  • 相关阅读:
    Apache服务器的简单配置与安全策略
    Linux下的ICMP反弹后门:PRISM
    项目年度任务失败总结
    SpringBoot下配置Druid
    ftm国际化解决方案
    SpringBoot自动装配源码解析
    log4j到log4j2升级迁移方案
    Linux常用命令记录
    MySQL安装后无法用root用户访问的问题
    html实体命名
  • 原文地址:https://www.cnblogs.com/walle-zhao/p/11696117.html
Copyright © 2020-2023  润新知