Условие: № 7357 (Уровень: Средний)
• Статья подготовлена командой itpy
• Полный разбор задачи в Telegram
(Л. Шастин) Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную чётную цифру;
– символ «» означает любое нечётное число; в том числе «» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123737465 и 123485.
Среди натуральных чисел, не превышающих 10**10 , найдите 5 наибольших чисел, соответствующих маске ?136*, делящихся на 53191 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на 53191.
Количество строк в таблице для ответа избыточно.
Решение через Python и комментарии к нему:
Комментарии к коду решения:
- from fnmatch import * - импорт всех функций из модуля fnmatch для работы с шаблонами и строками.
- R = [] - создание пустого списка R, куда будут добавляться результаты.
- Цикл for x in range(53191, 10**10, 53191): для перебора чисел от 53191 до 10^10 с шагом 53191;
- if fnmatch(str(x), '?136*'): - проверка, соответствует ли строковое представление числа x шаблону '?136*'.
- if str(x)[0] in '02468' and str(x)[-1] in '13579': - проверка, что первая цифра числа находится в диапазоне '02468', а последняя - в '13579'.
- R.append([x, x // 53191]) - добавление пары чисел [x, x // 53191] в список R.
- Цикл for i in range(-5, 0): для вывода последних пяти элементов списка R:
- print(*R[i]) - вывод списка элементов с индексами с -5 по -1.
Ответ:
8136574079 152969
8136680461 152971
8136786843 152973
8136893225 152975
8136999607 152977