Задача. Напишите программу, которая перебирает целые числа, большие 6 651 220, в порядке возрастания и ищет среди них числа, представленные в виде произведения ровно двух простых множителей, не обязательно различных, каждый из которых содержит в своей записи ровно одну цифру 2.
В ответе в первом столбце таблицы запишите первые 5 найденных чисел в порядке возрастания, а во втором столбце - для каждого из чисел соответствующий им наибольший из найденных множителей.
Пример числа:
Число 6651241 можно разложить на 2579 × 2579, и оба этих множителя — простые числа, содержащие ровно одну цифру "2".
Напишем функцию, которая возвращает список простых множителей, в виде произведения которых можно представить заданное натуральное число.
def f(n):
a = []
for k in range(2,int(n**0.5)+1):
while n%k==0:
a.append(k)
n//=k
if n>1:
a.append(n)
return a
В цикле для k от 2 до √n: пока число n делится на k, добавляем k в список множителей.
После разложения, если n > 1, значит, оно простое и тоже добавляется в список.
Проверяем работу функции
print(f(12)) # вывод [2, 2, 3]
print(f(424)) # вывод [2, 2, 2, 53]
print(f(6889)) # вывод [83, 83]
print(f(17)) # вывод [17]
Решаем задачу
p = 0 # Счётчик найденных чисел
x = 6_651_220 + 1 # Начинаем с числа после 6 651 220
while p != 5:
y = f(x)
if len(y) == 2: # Если ровно два простых множителя
# Проверяем, что в каждом множителе ровно одна "2"
if str(y[0]).count('2') == 1 and str(y[1]).count('2') == 1:
print(x, max(y)) # Выводим число и наибольший множитель
p += 1
x += 1 # Переходим к следующему числу
Вывод:
6651241 2579
6651262 3325631
6651286 3325643
6651314 3325657
6651347 289189