Разбор 24.PNG

№ 5227 (Уровень: Сложный) (М. Ишимов)

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:

Например, маске 123*4?5 соответствуют числа 123405 и 12300405.

Среди натуральных чисел, не превышающих 10**7, найдите все числа, соответствующие маске 3*52?, у которых нечётное количество делителей.

В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце – соответствующие им максимальные делители, не считая самого числа.

Untitled

Комментарии к решению:

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