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

How to reverse integer values from a while loop?

我正在尝试编写一个程序,将 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 循环的整数输出和反转它们时遇到困难。

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

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)

您可以一次生成一个整数,然后打印它:

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

将数字转换为基数 4 的最简单方法是首先使用 Python 的内置工具将数字转换为十六进制(基数 16),然后将每个十六进制数字映射到两个基数 4数字。因为每个4进制数代表2位,而每个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],这是等于给定的 base-16 数字的两个 base-4 数字。

  • 我们将生成的字符串与空字符串连接起来,得到一个包含所有数字的字符串。

  • 结果可能有一个前导零,因为任何小于 4 的十六进制数字都会导致以 0 开头的 base-4 数字对。因此我们使用 [=18 将其删除=].

  • 但是如果数字一开始是零,.lstrip() 会去掉整个数字,导致空字符串 ""or "0" 在空字符串的情况下恢复“0”。

递归求解:

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

这与您的工作方式相同,只是它通过将 mod 部分附加到字符串 递归调用 之后解决了您的问题 returns。因此,如果您以相反的顺序进行追加,则会再次遇到同样的问题

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

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)