Я пытаюсь создать стандартную функцию для преобразования любого десятичного значения в его восьмеричный, шестнадцатеричный и двоичный эквивалент, но по какой-то причине она не работает для двоичного кода. Я попытался добавить дополнительные меры предосторожности в условный оператор, чтобы проверить базу 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
уже является двоичным к моменту вызова вашего метода. - person user207421   schedule 21.09.2019