【问题标题】:How to reverse integer values from a while loop?如何从while循环中反转整数值?
【发布时间】:2015-04-10 20:54:56
【问题描述】:

我正在尝试编写一个程序来将基数为 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 的基数为 4 的值是 231,我希望将输出反转为 231。我该怎么做?我在加入 while 循环的整数输出和反转它时遇到了困难。

【问题讨论】:

  • 您只是以错误的顺序打印它。考虑将其存储在列表中的数字并反向打印列表。

标签: python reverse base-conversion


【解决方案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="")

【讨论】:

  • 感谢简单修改的​​代码。我不明白其中的一部分:为什么要包含“结果”累加器?如果您能解释结果变量的用途,我将不胜感激。另外,据我所知,我会将其初始化为 0。为什么将其初始化为 ""?
  • @abruzzi26 哪一部分你不明白?
  • 如果您查看我的代码,我在 while 循环中包含了 print 语句。为什么你的在循环之外?其次,作为累加器的“结果”变量的目的是什么?
  • 这就是我回答的重点。我正在构建结果,然后反转它,然后打印它。
  • 还有一件事:为什么结果变量初始化为“”,而不是0?
【解决方案2】:

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

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)

【讨论】:

  • 这段代码对我来说有点复杂,因为我还没有达到这个水平。感谢您的帮助:)
【解决方案3】:

将数字转换为以 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 开头的 base-4 数字对。所以我们使用 .lstrip("0") 去掉它。

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

【讨论】:

  • 我不会称之为“最简单的方法”。
  • 不错的选择。我仍然是初学者,所以我更喜欢我能理解的简短的代码。感谢您的帮助:)
【解决方案4】:

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

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)

【讨论】:

  • 我想在没有 Python 模块帮助的情况下编写代码。感谢您的回复:)
【解决方案5】:

递归解:

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

这与您的工作方式相同,只是它通过在递归调用返回后将 mod 部分附加到字符串 来解决您的问题。所以如果你以相反的顺序进行追加,你又回到了同样的问题

【讨论】:

  • 感谢您的解释。我不太明白这段代码中 return 函数的用途。你能帮我理解一下吗?
  • @abruzzi26 有 2 个返回语句,哪一个让你感到困惑?
猜你喜欢
  • 2023-03-09
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
相关资源
最近更新 更多