【发布时间】:2019-09-21 09:12:47
【问题描述】:
我正在尝试构建一个标准函数来将任何十进制值转换为其等效的八进制、十六进制和二进制,但由于某种原因它不适用于二进制。我尝试在条件语句中添加额外的预防措施以检查基数 2,但它仍然不起作用。
这是函数(我知道这不适用于十六进制值。我会在之后处理它):
def convert(num, base):
remainder = num % base
conv = []
if(remainder == 0):
conv.append('0')
elif(remainder != 0 and base == 2):
conv.append('1')
else:
conv.append(str(remainder))
result = ''.join(conv)
output = result[::-1]
return int(output)
在 elif(remainder != 0 and base == 2): 行中,我正在检查余数是否不是 0 并且基数是否为 2 以将 1 添加到临时 conv 列表中。然后我将列表转换为字符串,将其反转并将其作为 int 返回。
例如。如果输入是17,输出需要是这样的:
1 1 1 1
2 2 2 10
3 3 3 11
4 4 4 100
5 5 5 101
6 6 6 110
7 7 7 111
8 10 8 1000
9 11 9 1001
10 12 A 1010
11 13 B 1011
12 14 C 1100
13 15 D 1101
14 16 E 1110
15 17 F 1111
16 20 10 10000
17 21 11 10001
这些是负责输入和打印的函数:
def print_formatted(number):
# your code goes here
for i in range(number):
print(
str(i + 1) + " " +
str(convert(i + 1, 8)) + " " +
str(convert(i + 1, 16)) + " " +
str((convert(i + 1, 2)))
)
if __name__ == '__main__':
n = int(input())
print_formatted(n)
更新
我决定使用内置函数并修剪前两个字符(即0b),而不是遍历整个等式,以便它很好地适应格式。我试图根据二进制输出的宽度将它们彼此分开,但我想不出一种方法。这是我目前所拥有的:
def convert(num, base):
# get the highest power
val = ''
hex_char_list = ['A', 'B', 'C', 'D', 'E', 'F']
if(base == 2):
bin_num = bin(num)
bin_list = list(bin_num)
bin_list_2 = bin_list[2:]
val = ''.join(bin_list_2)
if(base == 8):
oct_num = oct(num)
oct_list = list(oct_num)
oct_list_2 = oct_list[2:]
val = ''.join(oct_list_2)
if(base == 16):
hex_num = hex(num)
hex_list = list(hex_num)
hex_list_2 = hex_list[2:]
val = ''.join(hex_list_2)
if val in hex_char_list:
val = val.upper()
return val
def print_formatted(number):
# your code goes here
width = len(convert(number, 2).format(number))
for i in range(number):
print(
str(i + 1) + width +
str(convert(i + 1, 8)) + width +
str(convert(i + 1, 16)) + width +
str((convert(i + 1, 2)))
)
if __name__ == '__main__':
n = int(input())
print_formatted(n)
【问题讨论】:
-
你得到的当前输出是什么?
-
什么十进制值?像往常一样,这个问题根本不涉及十进制值。
num在你的方法被调用时已经是二进制的了。