Тип 25 № 38603 
Раздел кодификатора ФИПИ: Обработка целочисленной информации. Нахождение делителей
i
Пусть M — сумма минимального и максимального натуральных делителей целого числа, не считая единицы и самого числа. Если таких делителей у числа нет, то значение M считается равным нулю.
Напишите программу, которая перебирает целые числа, бо́льшие 700 000, в порядке возрастания и ищет среди них такие, для которых значение M оканчивается на 8. Выведите первые пять найденных чисел и соответствующие им значения M.
Формат вывода: для каждого из пяти таких найденных чисел в отдельной строке сначала выводится само число, затем — значение М.
Строки выводятся в порядке возрастания найденных чисел.
Количество строк в таблице для ответа избыточно.
Решение. Заметим, что у каждого числа делители парные, например, у числа 8 это 1 и 8, 2 и 4. Будем находить первый натуральный делитель числа, отличный от единицы, и проверять, делится ли сумма найденного делителя с его парным делителем на 10 с остатком 8. Если условие выполняется — выводим исходное число и сумму его парных минимального и максимального делителей на экран и выходим из цикла для перебора делителей числа, иначе сразу выходим из цикла для перебора делителей числа.
Приведём решение на языке Pascal.
var
count, j, k, sqrtI, num: longint;
begin
num := 700000;
count := 0;
while True do begin
sqrtI := round(sqrt(num));
for j := 2 to sqrtI do begin
if num mod j = 0 then begin
if (j + num div j) mod 10 = 8 then begin
count := count + 1;
writeln(num, ' ', j + num div j);
break;
end
else break;
end;
end;
if count = 5 then break;
num := num + 1;
end;
end.
В результате работы программа должна вывести следующее:
700005 233338
700007 100008
700012 350008
700015 140008
700031 24168
Приведём решение Виктора Кима на языке Python.
count = 0
num = 700000
while count < 5:
num += 1
mx = 0
mn = num + 1
for i in range(2,int(num // 2)+1):
if num % i == 0:
mx = max(mx,i)
mn = min(mn,i)
M = mn + mx
if (M != num + 1) and (M % 10 == 8):
print(num, M)
count += 1
Приведём другое решение Мамаева Романа на языке Python.
count_del = 0
i = 700_000
while count_del < 5:
i += 1
for j in range(2, int(i ** 0.5) + 1):
if i % j == 0:
if i / j == i:
break
if (i / j + j) % 10 == 8:
print(i, i // j + j)
count_del += 1
break
Ответ: 700005&233338&700007&100008&700012&350008&700015&140008&700031&24168
38603
700005 233338 700007 100008 700012 350008 700015 140008 700031 24168
Раздел кодификатора ФИПИ: