25.03 Маски
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную цифру;
– символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 645*8?5 соответствуют числа 645835 и 64500835.
Среди натуральных чисел, не превышающих , найдите все числа, соответствующие маске 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) и идём до ,
увеличивая шаг на 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)
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

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

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

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

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

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!