Тема 25. Обработка целочисленной информации

25.03 Маски

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела обработка целочисленной информации
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#54984

Назовем маской числа последовательность цифр, в которой также могут встречаться следующие символы,

– символ "?"означает ровно одну произвольную цифру

– символ "*"означает любую последовательность цифр произвольной длины, в том числе и пустую последовательность

Среди натуральных чисел, не превышающих 107  , найдите все числа, соответствующие маске 9??5*1*?3 и кратные 111. В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания через пробел.

Показать ответ и решение

Решение через циклы:

Для решения данной задачи через циклы потребуется перебрать варианты в заданном диапазоне и с помощью условных операторов проверить, подходит ли число под заданную маску. Зададим цикл от числа, в котором будет минимально возможное число цифр (звёздочки меняем на пустоту и получаем 7 знаков), первая цифра в нашем числе - 9, меньше проверять смысла нет, если проанализировать заданную маску. Далее возьмём минимально возможное, кратное 111. Задаём цикл до максимального числа (по условию) с шагом 111, что автоматически учтёт кратность 111. Проверим каждое полученное число и выведем нужные.

# Для оптимизации делаем цикл с шагом 111 с числа кратного 111, таким образом, мы будем проходиться только по кратным 111 числам
# Возьмём минимальное число (уберём звёздочки и поставим первой 9), опираясь на маску
for i in range(9005208, 10 ** 7 + 1, 111):
    s = str(i) # Сделаем строку, чтобы проверить число, опираясь на индексы
    if s[0] == "9" and s[3] == "5" and s[4] == "1" and s[6] == "3": # Проверяем, что число удовлетворяет маске
        print(i, end=" ") # Выводим его

Решение через fnmatch:

Функция fnmatch позволяет проверить совпадение заданной строки с маской. В неё уже встроены обозначения звёздочки и знака вопроса, а значит нам нужно просто сделать перебор. Он будет полностью аналогичен перебору с циклов, но теперь мы будем использовать функцию для проверки маски. Выведем подходящие числа.

from fnmatch import fnmatch # Импортируем функцию
# Для оптимизации делаем цикл с шагом 111 с числа кратного 111, таким образом, мы будем проходиться только по кратным 111 числам
# Возьмём минимальное число (уберём звёздочки и поставим первой 9), опираясь на маску
for x in range(9005208, 10**7+1,111):
    if fnmatch(str(x), "9??5*1*?3"): # Проверяем, что число удовлетворяет маске. Функция всё сделает за нас.
        print(x) # Выводим подходящие числа

Ответ: 9575193 9585183 9595173 9605163 9615153 9625143 9635133 9645123 9655113 9665103

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!