从十进制转换为非十进制并打印(无字符串,数组和递归)

时间:2013-11-17 20:25:55

标签: c base-conversion non-recursive

需要帮助以了解如何将十进制数转换为非十进制数(任何,由用户输入给出)并打印它。限制是不允许数组和字符串,当我为此编写递归函数时,我正在考虑对同一事物采用非递归方法。

比任何重要/严肃的事情更多的是个人挑战/锻炼,所以请随时告诉我在哪里推..(

注意:我正在C中为此练习工作。

1 个答案:

答案 0 :(得分:0)

回想基础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