需要帮助了解如何将十进制数转换为非十进制形式(任何,由用户输入给出)并打印它。限制是不允许使用数组和字符串,虽然我为此编写了一个递归函数,但我正在为同一件事考虑一种非递归方法。
更多的是个人挑战/锻炼,而不是任何重要/严肃的事情,所以请随时告诉我该把自己推到哪里。
注意:我正在为这个练习使用 C 语言。
需要帮助了解如何将十进制数转换为非十进制形式(任何,由用户输入给出)并打印它。限制是不允许使用数组和字符串,虽然我为此编写了一个递归函数,但我正在为同一件事考虑一种非递归方法。
更多的是个人挑战/锻炼,而不是任何重要/严肃的事情,所以请随时告诉我该把自己推到哪里。
注意:我正在为这个练习使用 C 语言。
回想一下,x
基数B
表示为: x = a n B n + ... + a 2 B 2 + a 1 B + a 0,其中0≤a i <B。请注意,除以x
得到B
a n B n -1 + ... + a 2 B+ a 1余数 a 0 / B。换句话说,x mod B = a 0(mod是模数的缩写,即除法后的余数)。
作为算法实现:
var x = POSITIVE_INTEGER
var base = POSITIVE_INTEGER2
while x > 0
print(x mod base)
x = x div base // Where "div" is integer division, equivalent to math.floor(x/base)
// This way we are discarding a_0.
// Next iteration we will get a_1, then a_2, etc.
这将以相反的顺序打印数字。
解决方法:我们不是通过调制来获得最低有效数字,而是通过调制来获得最高有效数字。我们通过注意x - (x mod B n ) = a n来做到这一点,其中n
是最高有效位。
var x = POSITIVE_INTEGER
var base = POSITIVE_INTEGER2
var bn // This is base**n, where `n` is the most significant digit.
while x > 0
print(x - x mod bn) // Print out a_n
x = x mod bn // Discard a_n
bn = bn / base // Next iteration get a_(n-1), then a_(n-2), etc.
bn
可以计算为base ** math.floor(math.log(x) / math.log(base))
或通过做
var bn = 1
while bn * base < x
bn = bn * base