Запись чисел в различных системах счисления
Значение арифметического выражения
3·438 + 2·423 + 420 + 3·45 + 2·44 + 1записали в системе счисления с основанием 16. Сколько значащих нулей содержится в этой записи?
Анализ условия
Формулировка задания предлагает простой алгоритм решения задачи с помощью программы:
- построить шестнадцатеричную запись заданного числа в виде символьной строки;
- определить, сколько символов
0в этой строке.
К счастью, на каждом из этих шагов мы сможем использовать стандартные функции Python.
Решение
Найдём значение заданного арифметического выражения:
n = 3*4**38 + 2*4**23 + 4**20 + 3*4**5 + 2*4**4 + 1 print( n )
Напомним, что оператор ** в программе на Python означает возведение в степень.
Для перевода числа в шестнадцатеричную систему счисления можно применить f-строку:
h = f"{n:x}"
или встроенную функцию hex:
h = hex(n)[2:]
Функция hex возвращает символьную строку, где первые два символа — "0x" — обозначают, что далее записано число в шестнадцатеричной системе счисления. Срез [2:] удаляет эти два символа, так что символьная строка h содержит «чистую» шестнадцатеричную запись числа n.
Теперь можно применить метод count для символьных строк. Он определяет, сколько раз входит указанный символ (или подстрока) в основную строку, для которой он вызывается. Для вызова метода в Python используется точечная запись:
print( h.count('0') )
После выполнения этого фрагмента мы увидим, что строка h содержит:
Обсуждение решения
У нас получилось такое короткое решение только благодаря тому, что у символьных строк в Python есть метод count, который мы использовали. Если бы такого метода не было, пришлось бы выполнить цикл по всем элементам строки и с помощью дополнительной переменной count подсчитать количество нулей.
Классический вариант, который можно применить в большинстве языков программирования, — это перебор индексов всех символов строки:
count = 0 for i in range(len(h)): if h[i] == '0': count += 1 print( count )
Заголовок цикла, в котором вызываются функции range и len, выглядит запутанно, и лучше сразу перебирать сами символы строки h, а не их индексы:
count = 0 for c in h: if c == '0': count += 1 print( count )
В этой задаче для перевода числа в шестнадцатеричную систему счисления мы применили готовые инструменты Python. Для всех систем счисления, кроме двоичной, восьмеричной и шестнадцатеричной, такой возможности нет.
Решение без встроенных функций
Решим задачу без использования встроенных функций. В этом случае перевод в шестнадцатеричную систему придётся выполнять вручную с использованием цикла. Применим общий алгоритм: деление числа на 16 и составление результата из остатков от такого деления. Заметим, что вся шестнадцатеричная запись нам не нужна — интересуют только цифры 0 в ней. Поэтому мы будем просто считать, сколько остатков, равных нулю, получится при выполнении алгоритма:
count = 0 while n > 0: if n % 16 == 0: count += 1 n //= 16 print( count )
Символьная строка, содержащая шестнадцатеричную запись, здесь не строится, так как в этом нет необходимости.
Этот подход можно использовать для систем счисления с любыми основаниями.
🧮 Интерактивная проверка
Введите арифметическое выражение (можно использовать ** для возведения в степень) и выберите основание системы счисления — сервис покажет запись числа и посчитает нули.
Поддерживаются операции: +, -, *, /, //, %, **, а также целые числа.
Page 1 of 1









