计算机求解10进制转换任意进制

我们在高中必修三的数学书中,给的算法思想就是除k取余数法,先一直除,直到小于除数为止。

原理证明

n进制转化为10进制可表示为(n进制上的每一位都不会超过n)

\[(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
posted @ 2024-11-05 12:07  doctordragon666  阅读(65)  评论(1)    收藏  举报