Как решать задание 25 ЕГЭ по информатике (поиск делителей на Python)?
Задание 25 просит найти числа в диапазоне с определённым количеством делителей или с делителем заданного вида. Перебор делителей в лоб вроде работает, но не уверен в нюансах. Как решать задание 25 на Python?
2 ответа
Задание 25 — поиск чисел в заданном диапазоне с условием на делители (например: «ровно N делителей», «наибольший делитель, кроме самого числа, оканчивается на 3»).
Базовый шаблон — два цикла:
for x in range(A, B+1): # диапазон из условия
divs = [d for d in range(1, x+1) if x % d == 0] # все делители
if len(divs) == 5: # условие, например ровно 5 делителей
print(x, divs[-2]) # часто просят число и его делитель
x % d == 0 — d делит x. Список divs — все делители по возрастанию; divs[-2] — наибольший делитель, кроме самого x (предпоследний).
Ускорение (если диапазон большой и в лоб медленно) — перебирай делители до корня:
def divisors(x):
res = set()
d = 1
while d*d <= x:
if x % d == 0:
res.add(d); res.add(x//d)
d += 1
return sorted(res)
Частые ошибки:
- забыть, что 1 и само число тоже делители (влияет на «количество делителей»);
- спутать «наибольший делитель, кроме самого числа» (это
divs[-2]) с самим числом; - неверные границы диапазона (включительно ли B — обычно да,
range(A, B+1)).
Для типичных диапазонов ЕГЭ хватает и прямого перебора делителей.
Запомни: число делителей включает и 1, и само число. Поэтому «ровно 2 делителя» — это простые числа, «нечётное число делителей» — точные квадраты. Это часто и есть скрытый смысл условия.
Если просят «наибольший делитель, отличный от самого числа», бери предпоследний в отсортированном списке делителей (или само/минимальный простой множитель). Не путай его с самим числом — это самая частая ошибка в 25.