Подтема 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)Цикл проходит каждую цифру ровно один раз — справа налево, но для подсчёта порядок не важен.
Задача темы программой
Теперь возьмём число задачи темы.
Python считает целые числа точно любой длины, поэтому выражение пишут как есть: степень — , деление — только //.
n = 5**23 + 25**12 - 10count = 0while n > 0: if n % 5 == 4: count = count + 1 n = n // 5print(count)21 — как и блоками в подтеме 2. Поменяй основание, цифру и выражение — получится решение любой задачи на подсчёт цифр.
Тонкости:^ и деление через /
Знак ^ в Python — другая операция, не степень. А обычное деление / даёт : для числа из 17 цифр int(n / 3) уже ошибается (документация Python):
n = 5**23 + 25**12 - 10print(n // 3, int(n / 3))Список цифр
А если спрашивают не одну цифру, а сумму цифр, их количество или самую частую цифру?
Удобно один раз собрать все цифры в список — дальше любой вопрос о записи решает одна функция 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))Остатки собираются справа налево, поэтому в конце 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 цифр — как в блоках подтемы 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)В задачах спрашивают о разном, но всё решается тем же циклом — меняется только условие:
- Сколько цифр больше 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 — как блоками
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Нули в шестеричной записи 2016
Сколько нулей в шестеричной записи числа 2016? Найди руками делением и проверь программой.
Введите число.
Подсказка
Остатки от деления на 6 — цифры записи.
Решение
2016 = 6 · 336 + 0, 336 = 6 · 56 + 0, 56 = 6 · 9 + 2, 9 = 6 · 1 + 3, 1 = 6 · 0 + 1. Запись 13200₆, нулей два.
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(2016, 6).count(0))Ответ: 2
Единицы в 2¹⁰⁰ − 2⁵⁰ + 1
Сколько единиц в двоичной записи числа 2¹⁰⁰ − 2⁵⁰ + 1?
Введите число.
Подсказка
Python считает большие степени точно.
Решение
2¹⁰⁰ − 2⁵⁰ — пятьдесят единиц в разрядах 99…50 и пятьдесят нулей, плюс единица в разряде 0. Единиц 51.
print(bin(2 ** 100 - 2 ** 50 + 1)[2:].count('1'))Ответ: 51
Восьмёрки в девятеричной записи
Значение выражения 3 · 27¹⁵ + 9²⁰ − 2 · 3¹⁰ − 4 записали в системе счисления с основанием 9. Сколько цифр 8 содержится в этой записи?
Введите число.
Подсказка
Программа считает цифры без разбора блоков.
Решение
Программа переводит число делением на 9 и считает восьмёрки. В записи 100088888888888888688885₉ их 18.
def digits(n, q): if n == 0: return [0] result = [] while n > 0: result.append(n % q) n = n // q result.reverse() return result n = 3 * 27 ** 15 + 9 ** 20 - 2 * 3 ** 10 - 4print(digits(n, 9).count(8))Ответ: 18
Сумма цифр 7²⁰ − 1
Чему равна сумма цифр семеричной записи числа 7²⁰ − 1?
Введите число.
Подсказка
Собери цифры в список и сложи их.
Решение
7²⁰ − 1 — двадцать шестёрок. Сумма цифр 20 · 6 = 120.
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(sum(digits(7 ** 20 - 1, 7)))Ответ: 120
Различные шестнадцатеричные цифры
Сколько различных цифр в шестнадцатеричной записи числа 16¹⁰ − 16⁵ + 255?
Введите число.
Подсказка
Различные значения списка оставляет set.
Решение
16¹⁰ − 16⁵ — пять цифр F и пять нулей, + 255 = FF₁₆ заполняет два младших разряда: FFFFF000FF₁₆. Различных цифр две: F и 0.
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(len(set(digits(16 ** 10 - 16 ** 5 + 255, 16))))Ответ: 2
Цифры больше 9 в 36-ричной записи
Значение выражения 5 · 36²⁰ + 6⁴⁵ − 6¹⁰ − 2025 записали в системе счисления с основанием 36. Определи количество цифр с числовым значением, превышающим 9.
Введите число.
Подсказка
Цифры 36-ричной записи — числа от 0 до 35.
Решение
Список цифр хранит их значения, поэтому достаточно посчитать цифры больше 9. В записи 604ZZZZZZZZZZZZZZYZZYFR₃₆ это Z, Y, F и R — всего 20.
def digits(n, q): if n == 0: return [0] result = [] while n > 0: result.append(n % q) n = n // q result.reverse() return result n = 5 * 36 ** 20 + 6 ** 45 - 6 ** 10 - 2025print(sum(1 for d in digits(n, 36) if d > 9))Ответ: 20
Сумма цифр не больше 15
Значение выражения 4 · 31³⁰ + 9 · 31¹⁵ − 31⁶ + 2026 записали в системе счисления с основанием 31. Определи сумму цифр с числовым значением, не превышающим 15.
Введите число.
Подсказка
Отбери цифры не больше 15 и сложи их.
Решение
В 31-ричной записи цифры не больше 15 — это 4, 8, 2, 3, 11 и нули. Их сумма 4 + 8 + 2 + 3 + 11 = 28.
def digits(n, q): if n == 0: return [0] result = [] while n > 0: result.append(n % q) n = n // q result.reverse() return result n = 4 * 31 ** 30 + 9 * 31 ** 15 - 31 ** 6 + 2026print(sum(d for d in digits(n, 31) if d <= 15))Ответ: 28