我們在高中必修三的數學書中,給的演算法思想就是除k取餘數法,先一直除,直到小於除數為止。
原理證明
n進位制轉化為10進位制可表示為
\[(a_1 a_2 \dots a_m)_{(n)} = \sum _{k=1}^{m} a_{k}n^{m-k}
\]
這個時候,透過除以n,那麼其他的項均是可以整除的,所以這裡只留下最後一項不能被整除,用數學表示這個過程:
\[\frac {\sum _{k=1}^{m} a_{k}n^{m-k}}{n} = \sum _{k=1}^{m-1} a_{k}n^{m-k-1} + a_m/n
\]
知\(a_m/n\)無法被整除,所以餘數即為最後一位,這時候再繼續這個過程m次,直到\(\sum _{k=1}^{m} a_{k}n^{m-k}\)這部分為0的時候,我們就已經獲得了所有位上的值。結束
下面是給出這個問題的演算法程式碼求解
方法一:除k取餘數法(遞迴)
下面用的是python的遞迴虛擬碼
def to_base_n(x: int, base: int):
x == 0 -> ""
r = x % base
x >= base -> to_base_n(x // base, base) + str(r)
return str(r)
方法二:除k取餘數法(非遞迴)
這裡給出的是python非遞迴的虛擬碼
def decimal_to_base(dividend: int, base: int):
dividend == 0 -> "0"
digits = "0123456789ABCDEF"
result = ""
while {dividend > 0: dividend // base}:
result = digits[dividend % base] + result # 加在字元左邊,即反
return result
方法三:位運算
這種方法僅使用於特定情況,例如轉化為2進位制,或者其他2冪次的進位制
def decimal_to_binary_bitwise(n):
n == 0 -> "0"
binary = ""
while {n:n>>1}:
binary = str(n & 1) + binary
return binary