№ 7357 (Уровень: Средний)
(Л. Шастин) Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
– символ «?» означает ровно одну произвольную чётную цифру;
– символ «» означает любое нечётное число; в том числе «» может задавать и пустую последовательность.
Например, маске 123*4?5 соответствуют числа 123737465 и 123485.
Среди натуральных чисел, не превышающих 10**10 , найдите 5 наибольших чисел, соответствующих маске ?136*
, делящихся на 53191 без остатка.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им результаты деления этих чисел на 53191.
Количество строк в таблице для ответа избыточно.
Комментарии к коду решения:
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.
from fnmatch import *
R = []
for x in range(53191, 10**10, 53191):
if fnmatch(str(x), '?136*'):
if str(x)[0] in '02468' and str(x)[-1] in '13579':
R.append([x, x // 53191])
for i in range(-5, 0):
print(*R[i])
Присоединяйтесь и готовьтесь с нами: t.me/informatika_kege_itpy