我们在高中必修三的数学书中,给的算法思想就是除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 % basex >= 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) + binaryreturn binary