如何从 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)
我正在尝试编写一个程序,将 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)