К содержанию

Подтема 3 из 6

Цифры значения выражения программой

Как посчитать цифры любой записи программой: остаток и деление в цикле, список цифр и цифры со свойством.

Цифра за цифрой

Как посчитать четвёрки программой, не раскладывая выражение на блоки?

Программа повторяет одно действие: берёт последнюю цифру как n % q и отбрасывает её — n // q, пока число не станет нулём. Это перевод делением из подтемы 1, только цифры не записывают, а сразу проверяют.

Посчитаем нули в записи 329 = 2304₅. Нажми «Запуск» и пройди по шагам: n теряет цифру за цифрой, а count растёт только на нуле.

number = 329q = 5target = 0 n = numbercount = 0 while n > 0:    digit = n % q    if digit == target:        count = count + 1    n = n // q print(count)
1

Цикл проходит каждую цифру ровно один раз — справа налево, но для подсчёта порядок не важен.

Задача темы программой

Теперь возьмём число задачи темы.

Python считает целые числа точно любой длины, поэтому выражение пишут как есть: степень — , деление — только //.

n = 5**23 + 25**12 - 10count = 0while n > 0:    if n % 5 == 4:        count = count + 1    n = n // 5print(count)
21

21 — как и блоками в подтеме 2. Поменяй основание, цифру и выражение — получится решение любой задачи на подсчёт цифр.

Тонкости:^ и деление через /

Знак ^ в Python — другая операция, не степень. А обычное деление / даёт : для числа из 17 цифр int(n / 3) уже ошибается (документация Python):

n = 5**23 + 25**12 - 10print(n // 3, int(n / 3))
23841857910156246 23841857910156248

Список цифр

А если спрашивают не одну цифру, а сумму цифр, их количество или самую частую цифру?

Удобно один раз собрать все цифры в список — дальше любой вопрос о записи решает одна функция Python. Оформим перевод digits(n, q): она возвращает значений цифр слева направо. Пройди её по шагам:

def digits(n, q):    if n == 0:        return [0]     result = []     while n > 0:        result.append(n % q)        n = n // q     result.reverse()    return result  print(digits(329, 5))
[2, 3, 0, 4]

Остатки собираются справа налево, поэтому в конце result.reverse() переворачивает список. Выбери вопрос о записи 2304₅ — список [2, 3, 0, 4]:

Сколько нулей
ds.count(0) → 1
Сколько цифр всего
len(ds) → 4
Сумма цифр
sum(ds) → 9
Наибольшая цифра
max(ds) → 4
Сколько различных цифр
len(set(ds)) → 4

считает, сколько раз встречается значение, — длину списка, — сумму и наибольшее, оставляет только различные значения. Для задачи темы:

ds = digits(5**23 + 25**12 - 10, 5)print(ds.count(4), ds.count(0), len(ds), sum(ds))
21 2 25 88

21 четвёрка, 2 нуля, 25 цифр — как в блоках подтемы 2; сумма цифр 1 + 21 · 4 + 3 = 88.

Цифры со свойством

Запишем то же число в системе с основанием 36. Сколько в записи цифр больше 9?

Цифры со свойством считают циклом по списку: каждую цифру проверяют условием. по очереди берёт каждую цифру. В списке цифра 34 — одно число, букв для неё придумывать не нужно.

ds = digits(5**23 + 25**12 - 10, 36)print(ds)count = 0for d in ds:    if d > 9:        count = count + 1print(count)
[19, 20, 9, 25, 6, 34, 15, 19, 7, 16, 20] 8

В задачах спрашивают о разном, но всё решается тем же циклом — меняется только условие:

Сколько цифр больше 9
if d > 9: count = count + 1
Сколько чётных цифр
if d % 2 == 0: count = count + 1ноль тоже чётный
Сумма цифр не больше 17
if d <= 17: total = total + d
Самая частая цифра
max(range(q), key=ds.count) сравнивает цифры по их количеству
Тонкости:bin, oct и hex

Для оснований 2, 8 и 16 есть готовые , но их строка начинается служебным префиксом: bin(8) — это '0b1000'. При подсчёте нулей префикс отрезают: bin(n)[2:].count('0').

Итого

  • Циклn % q — цифра, n // q — остальное
  • Большие числаточны; степень — **, без /
  • digits(n, q)список цифр для любого основания
  • Вопросыcount, len, sum, set
  • Свойствоцикл по списку с условием
  • Задача темы21 — как блоками

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Какую цифру пятеричной записи числа 2024 даёт 2024 % 5?
ОтветСкрыть ответ
Ответ
4 — последнюю: 2024 = 31044₅.
Вопрос 2
Почему в Python степень пишут 5 ** 23, а не 5 ^ 23?
ОтветСкрыть ответ
Ответ
Знак ^ выполняет другую операцию; возведение в степень — **.
Вопрос 3
Сколько единиц в двоичной записи 2¹⁰⁰ − 2⁵⁰ + 1?
ОтветСкрыть ответ
Ответ
51: 2¹⁰⁰ − 2⁵⁰ — пятьдесят единиц и пятьдесят нулей, плюс 1.
Вопрос 4
Почему цифры записи хранят списком чисел, а не строкой?
ОтветСкрыть ответ
Ответ
При основании больше 10 цифра вроде 24 — одна цифра; в списке это одно число, а в строке пришлось бы придумывать буквы.
Вопрос 5
Чем количество цифр записи 2304 отличается от суммы цифр?
ОтветСкрыть ответ
Ответ
Цифр 4, а сумма цифр 2 + 3 + 0 + 4 = 9.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Нули в шестеричной записи 2016

Сколько нулей в шестеричной записи числа 2016? Найди руками делением и проверь программой.

Введите число.

Единицы в 2¹⁰⁰ − 2⁵⁰ + 1

Сколько единиц в двоичной записи числа 2¹⁰⁰ − 2⁵⁰ + 1?

Введите число.

Восьмёрки в девятеричной записи

Значение выражения 3 · 27¹⁵ + 9²⁰ − 2 · 3¹⁰ − 4 записали в системе счисления с основанием 9. Сколько цифр 8 содержится в этой записи?

Введите число.

Сумма цифр 7²⁰ − 1

Чему равна сумма цифр семеричной записи числа 7²⁰ − 1?

Введите число.

Различные шестнадцатеричные цифры

Сколько различных цифр в шестнадцатеричной записи числа 16¹⁰ − 16⁵ + 255?

Введите число.

Цифры больше 9 в 36-ричной записи

Значение выражения 5 · 36²⁰ + 6⁴⁵ − 6¹⁰ − 2025 записали в системе счисления с основанием 36. Определи количество цифр с числовым значением, превышающим 9.

Введите число.

Сумма цифр не больше 15

Значение выражения 4 · 31³⁰ + 9 · 31¹⁵ − 31⁶ + 2026 записали в системе счисления с основанием 31. Определи сумму цифр с числовым значением, не превышающим 15.

Введите число.