計算將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
秦九韶算法優化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM