需要帮助,了解如何将十进制数转换为非十进制形式(任何形式,由用户输入)并打印它。限制是不允许使用数组和字符串,虽然我为此编写了递归函数,但我正在考虑一种非递归方法。
与其说是任何重要/严肃的事情,不如说是个人挑战/锻炼,所以请告诉我该把自己推到哪里。
注意:我正在C中进行此练习。
回想一下,基数B
中的数字x
表示为:x=anbn+…+a2B2+a1B+a0,其中0≤ai<B。注意,用x
除以B
得到anBn-1+…+a2B+a1余数a0/B。换句话说,xmodb=a0(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-(xmodbn)=an,其中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