|
| 1 | +# 2. Написать программу сложения и умножения двух шестнадцатеричных чисел. При этом каждое число представляется |
| 2 | +# как массив, элементы которого это цифры числа. Например, пользователь ввёл A2 и C4F. Сохранить их как [‘A’, ‘2’] |
| 3 | +# и [‘C’, ‘4’, ‘F’] соответственно. Сумма чисел из примера: [‘C’, ‘F’, ‘1’], произведение - [‘7’, ‘C’, ‘9’, ‘F’, ‘E’]. |
| 4 | + |
| 5 | +from collections import deque |
| 6 | + |
| 7 | +BASE = 16 |
| 8 | + |
| 9 | +HEX_NUMBERS = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', |
| 10 | + 'A', 'B', 'C', 'D', 'E', 'F') |
| 11 | + |
| 12 | +BIN_NUMBERS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, |
| 13 | + '6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'B': 11, |
| 14 | + 'C': 12, 'D': 13, 'E': 14, 'F': 15} |
| 15 | + |
| 16 | + |
| 17 | +def sum_hex(first, second): |
| 18 | + """ |
| 19 | + Изменяемые объекты передаются по ссылке |
| 20 | + Используем копию, чтобы не ломать оригинал |
| 21 | + """ |
| 22 | + first = first.copy() |
| 23 | + second = second.copy() |
| 24 | + |
| 25 | + if len(second) > len(first): |
| 26 | + first, second = second, first |
| 27 | + |
| 28 | + second.extendleft('0' * (len(first) - len(second))) |
| 29 | + |
| 30 | + result = deque() |
| 31 | + overflow = 0 |
| 32 | + while len(first) != 0: |
| 33 | + first_num = BIN_NUMBERS[first.pop()] |
| 34 | + second_num = BIN_NUMBERS[second.pop()] |
| 35 | + |
| 36 | + result_num = first_num + second_num + overflow |
| 37 | + |
| 38 | + if result_num >= BASE: |
| 39 | + overflow = 1 |
| 40 | + result_num -= BASE |
| 41 | + else: |
| 42 | + overflow = 0 |
| 43 | + |
| 44 | + result.appendleft(HEX_NUMBERS[result_num]) |
| 45 | + |
| 46 | + if overflow == 1: |
| 47 | + result.appendleft('1') |
| 48 | + |
| 49 | + return result |
| 50 | + |
| 51 | + |
| 52 | +def mult_hex(first, second): |
| 53 | + first = first.copy() |
| 54 | + second = second.copy() |
| 55 | + |
| 56 | + if len(second) > len(first): |
| 57 | + first, second = second, first |
| 58 | + |
| 59 | + second.extendleft('0' * (len(first) - len(second))) |
| 60 | + result = deque('0') |
| 61 | + |
| 62 | + while len(second) != 0: |
| 63 | + second_num = BIN_NUMBERS[second.pop()] |
| 64 | + |
| 65 | + spam = deque('0') |
| 66 | + for _ in range(second_num): |
| 67 | + spam = sum_hex(spam, first) |
| 68 | + |
| 69 | + spam.extend('0' * (len(first) - len(second) - 1)) |
| 70 | + result = sum_hex(result, spam) |
| 71 | + |
| 72 | + return result |
| 73 | + |
| 74 | + |
| 75 | +a = deque(input('Введите первое число в hex формате (только цифры от 0 до f): ').upper()) |
| 76 | +b = deque(input('Введите второе число в hex формате (только цифры от 0 до f): ').upper()) |
| 77 | + |
| 78 | +# z = hex(int('a2', 16) + int('c4f', 16)) - плохой подход на два балла |
| 79 | +print(f'{list(a)} + {list(b)} = {list(sum_hex(a, b))}') |
| 80 | +print(f'{a} * {b} = {mult_hex(a, b)}') # специально убрал список, чтобы показать как хранится |
0 commit comments