我正在尝试编写一个程序,将基数为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循环中的整数输出,并将其反转。
答案 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)