Форум программистов, компьютерный форум, киберфорум
Наши страницы
m0nte-cr1st0
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Сложение чисел в шестнадцатеричной системе счисления.

Запись от m0nte-cr1st0 размещена 30.03.2019 в 17:16
Обновил(-а) m0nte-cr1st0 31.03.2019 в 11:05
Метки python, python 3

Недавно поступил вопрос с просьбой написать код для записи в "Шестнадцатеричной системе счисления".

Цитата:
Написать программу сложения и умножения двух шестнадцатеричных чисел. При этом каждое число представляется как массив, элементы которого это цифры числа. Например, пользователь ввёл A2 и C4F. Сохранить их как [‘A’, ‘2’] и [‘C’, ‘4’, ‘F’] соответственно. Сумма чисел из примера: [‘C’, ‘F’, ‘1’].
Возьмём пример поинтереснее, чем в условии. Предположим, нам на вход подаются значения в таком виде 2A2, FFD5F. Кстати, переводить их не за чем в списки. Ну если надо, то list(string) Вам в этом поможет.

Python
1
2
first = input()
second = input()
Если даже и приходят в другом виде, то преобразовать к такому, думаю, особого труда не составит.
Итак, создаём список из элементов 16-ричной системы

Python
1
list_of_numbers = [str(i) for i in range(10)] + ['A', 'B', 'C', 'D', 'E', 'F']
Сравниваем 2 входных строки и выбираем большую для итераций по её символам.

Python
1
2
if len(first) > len(second):
  first, second = second, first
Переворачиваем выбранную строку. Мне так удобней просто работать с ней.
и создаём третий список куда будем добавлять новые, найденные элементы.

Python
1
2
second = second[::-1]
third = []
Создаём вспомагательные переменные и запускаем цикл по большей строке. В нём находим индексы соответствующих элементов первой и второй строк в созданном ранее списке символов 16-ричной системы. Если у нас есть переход в другой разряд, то прибавляем k = 1, если нет, то k = 0. Чтоб не вывалится за границы, берём остаток от деления. C той же целью введён break.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
j = -1
k = 0
for i in second:
  one = list_of_numbers.index(i)
  two = list_of_numbers.index(first[j])
  third.append(list_of_numbers[(one + two + k) % 16])
  if (one + two) >= 15:
    k = 1
  else:
    k = 0
  j -= 1
  if j == -len(first)-1:
    break
Как только цикл закончен, проверям, отличались ли у нас вообще числа. Если да, то проходим по оставшимся символам большей строки и прибавляем их. Внимание! Тут нам приходится та же переменная k. Ведь могло быть такое, что последний элемент последней итерации предыдущего цикла перешёл в другой разряд. Мы это и учитываем благодаря переменной k.
Python
1
2
3
4
5
6
7
8
9
diff = len(second) - len(first)
 
if diff:
  for i in second[-diff:]:
    third.append(list_of_numbers[(list_of_numbers.index(second[-diff])+k)%16])
    if list_of_numbers.index(second[-diff])+1 >=15:
      k = 1
    else:
      k = 0
Ну и если после последний итерации этого цикла у нас число перешло в другой разряд, то просто добавляем ещё одну еденицу.
Python
1
2
if k == 1:
  third.append('1')
Ну и переворачиваем список в нужный нам вид
Python
1
print(third[::-1])
Проверить результаты можно на этом сервисе
http://www.reshinfo.com/hex_slozenije_2.php?sys=16&x=40&y=10

Конечно, с помощью какого-то модуля можно было сделать более изящное и не такое костыльное решение, но мне всё же захотелось своими руками всё это разобрать.
Если нашли какой-то баг, пишите. Посмотрю. Буду рад видеть замечания.
Размещено в Без категории
Просмотров 342 Комментарии 7
Всего комментариев 7
Комментарии
  1. Старый комментарий
    m0nte-cr1st0,
    мне кажется, что при таком представлении чисел для сложения можно использовать рекурсивную функцию.
    Запись от нтч размещена 31.03.2019 в 06:57 нтч вне форума
  2. Старый комментарий
    Цитата:
    Сообщение от нтч Просмотреть комментарий
    m0nte-cr1st0,
    мне кажется, что при таком представлении чисел для сложения можно использовать рекурсивную функцию.
    возможно, но у меня чет неприязнь к этим вашим рекурсиям)
    Запись от m0nte-cr1st0 размещена 31.03.2019 в 10:41 m0nte-cr1st0 на форуме
  3. Старый комментарий
    Python
    1
    2
    3
    4
    
    a = 'A2'
    b = 'C4F'
    c = hex(int(a, 16)+ int(b, 16))
    print(c)
    Запись от sam063rus размещена 01.04.2019 в 00:41 sam063rus вне форума
  4. Старый комментарий
    Цитата:
    Сообщение от m0nte-cr1st0 Просмотреть комментарий
    ..., но у меня чет неприязнь к этим вашим рекурсиям)
    Все программисты делятся на две группы:
    1. это программисты, которые знают и любят рекурсию
    2. те, кто только слышал о ней на примере функции n!...
    В первой группе программисты от бога, во второй - недоразумение...
    Запись от нтч размещена 01.04.2019 в 17:37 нтч вне форума
  5. Старый комментарий
    Цитата:
    Сообщение от нтч Просмотреть комментарий
    Все программисты делятся на две группы:
    1. это программисты, которые знают и любят рекурсию
    2. те, кто только слышал о ней на примере функции n!...
    В первой группе программисты от бога, во второй - недоразумение...
    я бы не был таким категоричным.
    с одной стороны вы правы. может, нужно побольше этому уделить внимание.
    с другой - то, что можно сделать рекурсией, можно сделать и без неё, пусть и код будет раз в 5 больше)
    а в ряде случаев циклы ещё и быстрее рекурсии.
    Запись от m0nte-cr1st0 размещена 02.04.2019 в 20:39 m0nte-cr1st0 на форуме
  6. Старый комментарий
    Цитата:
    Сообщение от sam063rus Просмотреть комментарий
    Python
    1
    2
    3
    4
    
    a = 'A2'
    b = 'C4F'
    c = hex(int(a, 16)+ int(b, 16))
    print(c)
    красиво, изящно. думал об этом варианте, конечно же. но всё же захотелось именно в 16-ричном варианте счисления это проделать
    Запись от m0nte-cr1st0 размещена 02.04.2019 в 20:41 m0nte-cr1st0 на форуме
    Обновил(-а) m0nte-cr1st0 02.04.2019 в 20:42
  7. Старый комментарий
    Цитата:
    Сообщение от m0nte-cr1st0 Просмотреть комментарий
    ... - то, что можно сделать рекурсией, можно сделать и без неё, пусть и код будет раз в 5 больше)
    а в ряде случаев циклы ещё и быстрее рекурсии.
    1. Быстрая сортировка массивов опирается на рекурсию
    2. Есть программы, где без рекурсии не обойтись. Например кривую Гильберта не нарисовать.
    3. Или программа "Ханойские башни". Слышали о такой?
    Запись от нтч размещена 03.04.2019 в 09:08 нтч вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru