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

25.03 Маски

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

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

Задача 1#57989

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

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

– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Например, маске 645*8?5 соответствуют числа 645835 и 64500835.

Среди натуральных чисел, не превышающих 108  , найдите все числа, соответствующие маске 34?8?97 и делящиеся на 29 без остатка. В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им частные от деления на 29.

Формат записи ответа: Найденное_число1 частное_от_деления_на_29_1 Найденное_число2 частное_от_деления_на_29_2 и тд.

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

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

Сначала мы перебираем все возможные варианты для каждой позиции, где в маске стоит символ «?».

1. Для первого вопросительного знака мы пробегаемся по всем цифрам от 0 до 9.

2. Для второго вопросительного знака также перебираем цифры от 0 до 9.

3. На каждой итерации мы собираем строку, которая соответствует числу, вставляя выбранные цифры на места «?».

4. Полученную строку преобразуем в целое число.

5. Проверяем делимость этого числа на 29. Если условие выполняется, печатаем само число и результат деления на 29.

for a1 in ("0123456789"):  # Перебираем все цифры для первого ’?’
    for a2 in ("0123456789"):  # Перебираем все цифры для второго ’?’
        s = "34" + a1 + "8" + a2 + "97"  # Составляем строку числа
        n = int(s)  # Преобразуем строку в число
        if n % 29 == 0:  # Проверяем, делится ли число на 29
            print(n, n // 29)  # Выводим число и частное

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

В этом подходе мы используем встроенный модуль fnmatch, который позволяет сравнивать строки с шаблонами, содержащими символы «?» и «*».

1. Ограничиваем диапазон проверки числами от 3 000 000 до 4 000 000, так как маска «34?8?97» задаёт числа именно в этом промежутке.

2. Для каждого числа из диапазона преобразуем его в строку и проверяем, подходит ли оно под маску «34?8?97».

3. Если число подходит и делится на 29 без остатка, выводим его и частное.

# Импортируем модуль fnmatch для нужной функции
from fnmatch import *

# Нет смысла рассматривать числа вне данного промежутка,
# т.к они точно не подойдут
for i in range(3000000, 4000000):
    # fnmatch — функция, сравнивающая строку с указанной маской
    # Возвращает True, если строка подходит к маске
    if fnmatch(str(i), "34?8?97") and i % 29 == 0:
        print(i, i // 29)

Решение через срезы

Здесь мы используем оптимизацию: перебираем только числа, кратные 29.

1. Для этого начинаем цикл с числа 3 408 109 (это ближайшее к маске число, которое делится на 29) и идём до  107  , увеличивая шаг на 29.

2. Каждое число переводим в строку.

3. Проверяем условия маски:

1) первые две цифры равны «34»;

2) четвёртая цифра равна «8»;

3) последние две цифры равны «97».

4. Если все условия выполняются, выводим число и частное от деления.

# для оптимизации пишем цикл с шагом 29, начиная с числа кратного 29,
# таким образом, мы будем проходиться только по кратным 29 числам
for x in range(3408109, 10**7 + 1, 29):
    n = str(x)
    if "34" in n[:2] and n[3] == "8" and "97" in n[-2:]:  # проверяем маску
        print(x, x // 29)

Ответ: 3418897 117893 3468197 119593 3488497 120293

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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