№ 5227 (Уровень: Сложный) (М. Ишимов)
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:
Например, маске 123*4?5 соответствуют числа 123405 и 12300405.
Среди натуральных чисел, не превышающих 10**7, найдите все числа, соответствующие маске 3*52?, у которых нечётное количество делителей.
В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им максимальные делители, не считая самого числа.
from fnmatch import *
- Импортируем все функции из библиотеки fnmatch
.for x in range(3520, 10**7):
- Создаём цикл по диапазону чисел от 3520 до 10**7 (в соответствии с условием) с помощью переменной x
if fnmatch(str(x), '3*52?'):
- Проверяем, соответствует ли строковое представление x
шаблону '3*52?', используя функции fnmatch
divisors = set()
- Создаём пустое множество divisors
for j in range(2, int(x ** 0.5) + 1):
- Пробегаем цикл по диапазону чисел от 2 до квадратного корня из x
плюс 1 (используем квадратный корень, так как это значительно ускоряет выполнение программы) с помощью переменной j
if x % j == 0:
- Проверяем, делится ли x
на j
без остатка.divisors.add(j)
- Добавляем j
во множество divisors
divisors.add(x // j)
- Добавляем результат целочисленного деления x
на j
во множество divisors
.