Найти тему

Разбор номера 6210 ЕГЭ по информатике #25

Оглавление

Условие: № 6210 (Уровень: Средний)

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

  • символ «?» означает ровно одну произвольную цифру;
  • символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность.

Например, маске 123*4?5 соответствуют числа 123405 и 12300425.
Найдите все натуральные числа, не превосходящие
10**7, для которых выполняются одновременно все условия:

  • соответствуют маске *2?2*;
  • являются палиндромами;
  • делятся на число 53 без остатка;
  • количество делителей больше 30.

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

-2
def Divisors(x):
divisors = set()
for j in range(1, int(x**0.5)+1):
if x % j == 0:
divisors.add(j)
divisors.add(x // j)
return sorted(divisors)

from fnmatch import *
for x in range(53, 10**7, 53):
if fnmatch(str(x), '*2?2*'):
if str(x) == str(x)[::-1]:
if x % 53 == 0:
diviors = Divisors(x)
if len(diviors) > 30:
print(x, sum(diviors))

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

  1. def Divisors(x): - Объявляем функцию Divisors, которая принимает один аргумент x и будет вычислять его делители.
  2. divisors = set() - Создаем пустое множество divisors, куда будем складывать найденные делители.
  3. for j in range(1, int(x**0.5)+1): - Используем цикл for, чтобы перебрать все значения j в интервале от 1 до квадратного корня из x. Уверен этот шаг стоит пояснить подробнее: такой алгоритм позволяет пробежать суммарно меньше чисел, но способствует нахождению первой половины делителей числа, а через найденные делители мы сможем найти их сомножители, например: делители числа 24: {1, 2, 3, 4, тут корень , 6, 8, 12, 24}
  4. if x % j == 0: - Проверяем, делится ли x на j без остатка.
  5. divisors.add(j) - Если x делится на j без остатка, добавляем j во множество divisors.
  6. divisors.add(x // j) - Если x делится на j без остатка, добавляем x // j во множество divisors, то есть сомножитель числа j.
  7. return sorted(divisors) - Возвращаем множество divisors, отсортированное по возрастанию (сортировать не обязательно, но приятная фишка).
  8. from fnmatch import - Импортируем все функции из модуля fnmatch, для работы с масками «*», «?»
  9. for x in range(53, 10**7, 53): - Используем цикл for, чтобы перебрать все значения x в интервале от 53 до 10 миллионов с шагом 53, таким образом удовлетворяем условию, что число должно делиться на 53.
  10. if fnmatch(str(x), '2?2'): - Проверяем, соответствует ли строковое представление x шаблону 2?2*, используя функцию fnmatch (это одноименная функция из библиотеки fnmatch).
  11. if str(x) == str(x)[::-1]: - Проверяем, является ли строковое представление x палиндромом (то есть равным своему перевернутому виду).
  12. if x % 53 == 0: - Проверяем, является ли x кратным 53 (из-за шага в переборе - это действие бесполезное).
  13. diviors = Divisors(x) - Вычисляем все делители x, используя функцию Divisors, и сохраняем результат в переменной divisors.
  14. if len(diviors) > 30: - Проверяем, имеет ли x более 30 делителей.
  15. print(x, sum(diviors)) - Если x соответствует всем условиям, выводим его и сумму всех его делителей на экран.
-3
from fnmatch import *
for x in range(53, 10**7, 53):
if fnmatch(str(x), '*2?2*'):
if str(x) == str(x)[::-1]:
divisors = set()
for j in range(1, int(x**0.5)+1):
if x % j == 0:
divisors.add(j)
divisors.add(x//j)
if len(divisors) > 30:
print(x, sum(divisors))

Ответ:

212212 508032
2527252 5588352
4282824 13789440
4626264 11787120
8125218 19595520
8824288 19908504

Информатика ЕГЭ | itpy 👨‍💻

Присоединяйтесь и готовьтесь вместе с нами: https://t.me/+SIliQTddHE8xNTk6
Присоединяйтесь и готовьтесь вместе с нами: https://t.me/+SIliQTddHE8xNTk6