Задание №25 — Проверка делимости
Пусть M — сумма минимального и максимального натуральных делителей целого числа, не считая единицы и самого числа. Если таких делителей у числа нет, то значение M считается равным нулю. Напишите программу, которая перебирает целые числа, бо́льшие 700 000, в порядке возрастания и ищет среди них такие, для которых значение M оканчивается на 8. Выведите первые пять найденных чисел и соответствующие им значения M. Формат вывода: для каждого из пяти таких найденных чисел в отдельной строке сначала выводится само число, затем — значение М. Строки выводятся в порядке возрастания найденных чисел. Количество строк в таблице для ответа избыточно.
Правильный ответ
700005 233338 700007 100008 700012 350008 700015 140008 700031 24168
Пояснение
Решение:
У целого числа наименьший делитель, отличный от единицы, — это его наименьший простой делитель . Ему в пару идёт наибольший делитель, отличный от самого числа, равный . Значит, оба «крайних» делителя находятся за один проход: достаточно перебрать от 2 до и остановиться на первом, который делит . Если такого нет, число простое, промежуточных делителей у него нет.
Здесь — сумма крайних делителей. Условие «оканчивается на 8» касается последней цифры, то есть m % 10 == 8. Перебираем числа, начиная с 700001, по возрастанию и останавливаемся, найдя пять подходящих.
def M(n):
d = 2
while d * d <= n:
if n % d == 0:
return n // d + d # наибольший делитель плюс наименьший
d += 1
return 0 # n простое: делителей нет
n = 700000
found = 0
while found < 5:
n += 1
m = M(n)
if m % 10 == 8:
print(n, m)
found += 1
Программа выводит:
700005 233338 700007 100008 700012 350008 700015 140008 700031 24168Ответ: 700005 233338 700007 100008 700012 350008 700015 140008 700031 24168