25.03 Маски
Ошибка.
Попробуйте повторить позже
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
1) символ «?» означает ровно одну произвольную цифру;
2) символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Среди натуральных чисел, не превышающих ,
найдите все числа, соответствующие маске 1*3577?0, делящиеся на 1975 без остатка. В ответе запишите все найденные
числа в порядке возрастания, и через пробел – соответствующие им результаты деления этих чисел на
1975.
Формат ввода ответа: найденное_число1 результат_деления1 найденное_число2 результат_деления2 и так далее.
Решение через fnmatch
from fnmatch import fnmatch # для оптимизации делаем цикл с шагом 1975, начиная с числа кратного 1975, для того чтобы проходиться по числам кратным 1975 for x in range(1358800,10**9+1,1975): if fnmatch(str(x),’1*3577?0’): # проверка, что число соответствует маске print(x,x//1975)
Решение через itertools
’’’ Идея решения заключается в том, чтобы по частям собирать число, удовлетворяющее маске и затем проверять его на кратность. Такое решение оптимальнее по времени поскольку мы не проверяем числа не подходящие по маске, а сразу составляем те, что нам подходят. ’’’ from itertools import product#импортируем модуль product из itertools digits = ’0123456789’#всевозможные цифры res = []#список, в который мы будем сохранять числа for i in range(3):#проведя анализ, можно понять, что в звёздочке не может быть больше двух цифр, #по этой причине делаем цикл от 0 до 2 включительно. for digit_1 in product(digits,repeat = i):#делаем произвольную подпоследовательность из цифр, #таким способом, мы симулируем звёздочку for digit_2 in product(digits,repeat = 1):#такой записью, мы симулируем знак вопроса res += [int(’1’ + ’’.join(digit_1) + ’3577’ + ’’.join(digit_2) + ’0’)] #собираем нашу маску по частям, функция join переводит элементы кортежа, списка в строку. for x in sorted(set(res)):#проходимся по всем получившимся числам if x <= 10**9 and x % 1975 == 0: print(x,x//1975)#вывод числа и его частного
Решение через срезы
# для оптимизации делаем цикл с шагом 1975, начиная с числа кратного 1975, для того чтобы проходиться по числам кратным 1975 for x in range(1358800,10**9+1,1975): n = str(x) if n[0] == ’1’ and n[-1] == ’0’ and ’3577’ in n[-6:-2]: # проверка, что число соответствует маске print(x,x//1975)
Специальные программы

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

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

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

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

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

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