ЕГЭ, ОГЭ, программирование и робототехника в Калининграде

№ 25017. Основная волна

Пусть М — сумма минимального и максимального простых натуральных делителей целого числа, не считая самого числа. Если таких делителей у числа нет, то значение М считается равным нулю.

Напишите программу, которая перебирает целые числа, большие 5 400 000, в порядке возрастания и ищет среди них такие, для которых М больше 60 000 и является палиндромом, т.е. одинаково читается слева направо и справа налево

В ответе запишите в первом столбце таблицы первые  пять найденных чисел в порядке возрастания, а во втором столбце — соответствующие им значения М.
Например, для числа 298 M = 2 + 149 = 151.

from math import isqrt


def get_divisors(num):
    divisors = set()
    for i in range(2, isqrt(num) + 1):
        if num % i == 0:
            divisors |= {i, num // i}
    return divisors


def is_palindrome(num):
    s = str(num)
    return s == s[::-1]


def is_prime(num):
    if num < 2:
        return False
    if num == 2:
        return True
    if num % 2 == 0:
        return False
    if num == 3:
        return True
    if num % 3 == 0:
        return False
    for div in range(5, isqrt(num) + 1, 6):
        if num % div == 0 or num % (div + 2) == 0:
            return False
    return True


def f(num):
    divisors = [div for div in get_divisors(num) if is_prime(div)]

    if not divisors:
        return 0

    M = min(divisors) + max(divisors)
    if M > 60_000 and is_palindrome(M):
        return M

    return 0


cnt = 0
for i in range(5_400_001, 10 ** 20):
    if M := f(i):
        print(i, M)
        cnt += 1
        if cnt == 5:
            break
Разберём это задание на бесплатном пробном занятии

Преподаватель покажет, как решать такие задачи, и подскажет, с чего начать подготовку. Группы до 8 человек, очно в Калининграде и онлайн.

Записаться на пробное занятие