如何从while循环中反转整数值?

时间:2015-04-10 20:54:56

标签: python reverse base-conversion

我正在尝试编写一个程序,将基数为10(十进制)的数字转换为基数为4的数字。这是我提出的代码:

def decimal_to_base4(num):
    while num > 0:
        quotient = num//4
        base4 = num%4
        num = quotient
        print(base4, end="")
decimal_to_base4()

除了一个问题外,此代码工作正常:

例如,如果我的参数值为45,则输出变为132.但是,由于45的base-4值为231,我希望该输出反转为231.我该怎么做?我很难加入while循环中的整数输出,并将其反转。

5 个答案:

答案 0 :(得分:1)

您可以使用列表存储结果,然后按相反的顺序打印列表

def decimal_to_base4(num):
    base4_ = []
    while num > 0:
        quotient = num//4
        base4 = num%4
        num = quotient
        base4_.append(str(base4))
    base4_ = "".join(base4_)
    print base4_[::-1]
decimal_to_base4(45)

答案 1 :(得分:1)

您可以一次构建一位数的整数,然后打印它:

def decimal_to_base4(num):
    result=""
    while num > 0:
        quotient = num//4
        result+=str(num%4)
        num = quotient
    result = result[::-1]
    print(result, end="")

答案 2 :(得分:1)

将数字转换为基数4的最简单方法是首先使用Python的内置工具将数字转换为十六进制(基数为16),然后将每个十六进制数字映射到两个基数为4的数字。由于每个base-4数字代表2位,每个base-16数字代表4位,因此这是精确映射。

DIGIT_MAP = {"0": "00", "1": "01", "2": "02", "3": "03",
             "4": "10", "5": "11", "6": "12", "7": "13",
             "8": "20", "9": "21", "a": "22", "b": "23",
             "c": "30", "d": "31", "e": "32", "f": "33"}

def decimal_to_base4(num):
    return "".join(DIGIT_MAP[c] for c in "%x" % num).lstrip("0") or "0"

工作原理:

  • 首先,我们使用"%x" % num将传入号码转换为十六进制。我们也可以使用hex(),但这会为转换添加一个前导0x,然后我们必须将其删除(即,这也可以写为hex(num)[2:])。

  • 我们循环结果,将c设置为数字十六进制版本中的每个字符。

  • 对于循环中的每次迭代,我们得到DIGIT_MAP[c],这是两个基数为4的数字,等于给定的基数为16的数字。

  • 我们使用空字符串连接结果字符串,从而生成一个包含所有数字的单个字符串。

  • 结果可能具有前导零,因为任何小于4的十六进制数字都会导致以0开头的基数为4的数字对。所以我们使用.lstrip("0")将其删除。< / p>

  • 但如果数字开头为零,.lstrip()将取消整个数字,从而产生一个空字符串""or "0"在空字符串的情况下恢复“0”。

答案 3 :(得分:0)

递归解决方案:

def decimal_to_base4(num):
    if num < 4:
        return str(num)
    return decimal_to_base4(num // 4) + str(num % 4)

这与你拥有的方式相同,只不过它通过在递归调用返回之后将mod部分附加到字符串来解决问题。因此,如果您按相反顺序执行追加,则会再次回到同一问题

答案 4 :(得分:0)

也可以使用递归方法,例如

import sys

def decimal_to_base4(num):
    if num == 0:
       return
    quotient = num//4
    base4 = num%4
    num = quotient
    decimal_to_base4(num)
    sys.stdout.write(str(base4))

decimal_to_base4(45)