c-从十进制转换为非十进制并打印(没有字符串、数组和递归)



需要帮助,了解如何将十进制数转换为非十进制形式(任何形式,由用户输入)并打印它。限制是不允许使用数组和字符串,虽然我为此编写了递归函数,但我正在考虑一种非递归方法。

与其说是任何重要/严肃的事情,不如说是个人挑战/锻炼,所以请告诉我该把自己推到哪里。

注意:我正在C中进行此练习。

回想一下,基数B中的数字x表示为:x=anbn+…+a2B2+a1B+a0,其中0≤ai<B。注意,用x除以B得到anBn-1+…+a2B+a1余数a0/B。换句话说,xmodb=a0mod的缩写,它是除法后的余数)。

作为算法实现:

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

相关内容

  • 没有找到相关文章

最新更新