Все задачи №25
№25

Произведение двух простых с «16»

Перебирай целые числа > 1 103 285 717. Найди числа-произведения ровно двух простых (не обязательно различных), каждый из которых содержит «16» ровно один раз. Выведи первые 5 и наименьший множитель каждого.

Источник: ФИПИ, № 31519

Ответвпиши то, что вывела программа
Показать разбор
  1. Напиши p(x), которая проверяет простоту перебором делителей до корня.
  2. Напиши good(x): число простое и «16» встречается в его записи ровно один раз.
  3. Напиши f(x): перебирай делители d до корня и добавляй d и x // d в список, если оба хорошие.
  4. Перебирай числа по возрастанию, начиная со следующего за данным в условии.
  5. Если в списке ровно два числа, выводи x и min(D). После пятого найденного останавливайся.
def p(x):
    return x > 1 and all(x % d != 0 for d in range(2, int(x ** 0.5) + 1))

def good(x):
    return str(x).count('16') == 1 and p(x)

def f(x):
    D = []
    for d in range(2, int(x ** 0.5) + 1):
        if x % d == 0:
            if good(d) and good(x // d):
                D.append(d)
                D.append(x // d)
    return D

n = 0
for x in range(1103285718, 10 ** 20):
    D = f(x)
    if len(D) == 2:
        print(x, min(D))
        n += 1
        if n == 5:
            break