zoukankan      html  css  js  c++  java
  • 计算将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
    秦九韶算法优化
  • 相关阅读:
    如何使用CslaGen生成CSLA DAL层代码
    DefaultCellStyle.NullValue与CellEndEdit
    列Readonly的问题
    IOS谓词NSPredicate
    项目展示新浪微博客户端
    KVO的概述与使用
    iOS设计模式——委托(delegate)
    ScrollView
    UIButton
    ScrollView图片的放大缩小
  • 原文地址:https://www.cnblogs.com/walle-zhao/p/11696117.html
Copyright © 2011-2022 走看看