計算機求解10進位制轉換任意進位制

doctordragon666發表於2024-11-05

我們在高中必修三的數學書中,給的演算法思想就是除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

相關文章