最近筆試面試也遇到這種進制轉換的題,來總結一下!
任意進制轉換爲10進制
舉例:
二進制:1101
轉爲十進制爲:從最低位(從左到右)開始遍歷,1 * 2^0 + 0 * 2^1 + 1 * 2^2 + 1 * 2^3 = 1 +0 + 4 + 8 = 13
三進制:2101
轉爲10進製爲:1 * 3^0 + 0 * 3^1 + 1 * 3^2 + 2 * 3^3 = 1 + 0 + 9 + 54 = 64
總結出規律,從低位到高位,每一位乘以權重,再相加,權重是進制的位數次方
def anyToTen(m, origin):
# m: int
# origin:str
# return: int
# 任意進制的數轉換爲10機制
# 直接利用int的自帶功能
return int(str(origin), base = m) # origin必須是字符串啊
或者使用公式進行計算:
def anyToTen(m, origin):
# 任意進制的數轉換爲10機制
# 先將m轉換爲10進制
# 公式 num = an * m**(n-1) + an-1 * m**(n-2).....+ a0 * m**0
n = len(origin)
res = 0
for i in range(len(origin)):
res += int(origin[i]) * pow(m, n-i-1)
return res
十進制轉化爲任意進制
舉例:
十進制:124
二進制:通過輾轉相除取餘法,過程如下
當然,轉化爲10以上進制時,需要用字母來表示,比如10用’A’
def trans_map(cint):
# cint: int
# return: str
# 把數字轉化爲相應字符,比如10-a, 11-b
if cint < 0:
return None
elif cint < 10: # 數字轉爲字母
return str(cint)
elif cint >= 10: # ASCII碼轉爲字母A-Z
return chr(cint - 10 + 65)
def tenToAny(n, origin):
# n進制: int
# origin: int
# return: str
res = ''
while origin:
res = trans_map(origin % n) + res # 需要逆序
origin = origin // n # 一定要整除,不然除3會進入死循環
return res