Как решать задание 17 ЕГЭ по информатике — обработка массива чисел на Python
Разбор задания 17 ЕГЭ по информатике: чтение файла, условия на числа, сумма цифр, простые числа, палиндромы. Шаблоны решений на Python и типичные ошибки.
О чём задание
Задание 17 КЕГЭ — обработка массива целых чисел из файла. Вход всегда один и тот же: текстовый файл (обычно 17.txt), в каждой строке — одно целое число. Количество чисел — до 10 000. Твоя задача — пройтись по массиву, отобрать числа (или пары/тройки соседних) по условиям из формулировки, и вывести метрику: количество, сумму, максимум, минимум или пару чисел.
Задание базового уровня, стоит 1 первичный балл. В КЕГЭ 2026 на все 27 заданий даётся 235 минут и 29 первичных баллов (1-25 по 1 баллу, 26-27 по 2 балла). Разбор структуры экзамена и всех изменений — в статье про ЕГЭ 2026. Задание 17 — одно из самых стабильных по формату: шаблон решения почти не меняется год от года.
Шаблон решения
Любое решение задания 17 укладывается в четыре шага:
- Прочитать файл в список чисел
- Определить условие на число (или на пару чисел)
- Пройти циклом и посчитать метрику
- Вывести ответ
Минимальная версия:
with open('17.txt') as f:
nums = [int(x) for x in f]
result = sum(1 for n in nums if n % 3 == 0 and n > 1000)
print(result)
Этот код читает файл, считает количество чисел, которые кратны 3 и больше 1000, и печатает ответ. Запомни эту конструкцию — 80% задач 17 решаются её модификацией.
Чтение файла: нюансы
for x in f— итерация по строкам, работает для файлов любого размераint(x)автоматически отбросит\nв конце строки и пробелы- Если на одной строке может быть несколько чисел — используй
nums = list(map(int, f.read().split())) - Путь к файлу — ровно такой, как указан в условии. Не меняй
17.txtнаinput.txt, это распространённая невнимательность
Типовые условия на число
В формулировке задачи встречаются несколько стандартных условий. Запомни их и научись превращать в Python за 10 секунд.
| Условие из задачи | Python |
|---|---|
| делится на K | n % K == 0 |
| не делится на K | n % K != 0 |
| содержит цифру D | str(D) in str(n) |
| сумма цифр равна S | sum(int(c) for c in str(n)) == S |
| сумма цифр меньше M | sum(int(c) for c in str(n)) < M |
| число палиндром | str(n) == str(n)[::-1] |
| заканчивается на цифру D | n % 10 == D |
| длина числа K цифр | len(str(n)) == K |
| число чётное | n % 2 == 0 |
| число простое | is_prime(n) (см. ниже) |
| число в диапазоне [a, b] | a <= n <= b |
Для простоты заведи свою функцию:
def is_prime(n):
if n < 2:
return False
if n < 4:
return True
if n % 2 == 0:
return False
i = 3
while i * i <= n:
if n % i == 0:
return False
i += 2
return True
Эта функция проверяет число на простоту за O(√n). Для n до 10^7 считается мгновенно. На массиве из 10 000 чисел — суммарно доли секунды.
Ещё одна полезная функция — сумма цифр:
def digit_sum(n):
return sum(int(c) for c in str(abs(n)))
С помощью abs мы корректно работаем с отрицательными числами. Если в задаче числа только положительные — abs можно опустить.
Типовые подзадачи
Подзадача А: количество по условию
Самый частый вариант. Метрика — количество чисел, удовлетворяющих условию.
with open('17.txt') as f:
nums = [int(x) for x in f]
result = sum(1 for n in nums if digit_sum(n) < 10 and n % 7 == 0)
print(result)
Подзадача Б: сумма по условию
result = sum(n for n in nums if n % 3 == 0 and n > 1000)
print(result)
Подзадача В: максимум/минимум по условию
result = max(n for n in nums if is_prime(n))
print(result)
Если по условию может не оказаться ни одного подходящего числа — оберни в try/except или передай дефолт:
result = max((n for n in nums if is_prime(n)), default=0)
Подзадача Г: пары соседних чисел
Считаем пары (nums[i], nums[i+1]) с общим условием:
result = sum(
1 for i in range(len(nums) - 1)
if nums[i] % 3 == 0 and nums[i+1] % 3 == 0
)
print(result)
Подзадача Д: пара, сумма которой максимальна
Один из самых «вредных» подтипов — нужно найти пару соседних чисел с дополнительным условием и вернуть их сумму (или произведение) максимальной/минимальной величины:
best = None
for i in range(len(nums) - 1):
a, b = nums[i], nums[i+1]
if a % 3 == 0 and b % 3 == 0:
s = a + b
if best is None or s > best:
best = s
print(best)
Подзадача Е: две метрики одновременно
Например: «найди количество чисел, удовлетворяющих условию, и их сумму». Один цикл, два счётчика:
cnt = 0
total = 0
for n in nums:
if n % 5 == 0 and digit_sum(n) > 10:
cnt += 1
total += n
print(cnt, total)
Главный trick задания 17: даже если тебя просят несколько метрик (максимум, минимум, сумма, количество), всё считается за один проход. Не пиши четыре отдельных цикла — это увеличит шансы ошибиться и замедлит работу.
Полный разбор примера
Условие. В файле 17.txt содержится 10000 целых положительных чисел. Найди количество пар чисел, стоящих рядом, обе цифры каждого из которых — простые (2, 3, 5, 7), а сумма пары кратна 13. Выведи искомое количество и максимальную из таких сумм.
Шаг 1. Читаем файл.
with open('17.txt') as f:
nums = [int(x) for x in f]
Шаг 2. Вспомогательная функция — проверяем, что все цифры числа простые.
def all_digits_prime(n):
primes = {'2', '3', '5', '7'}
return all(c in primes for c in str(n))
Здесь трюк с множеством: primes — это set из строковых цифр, и c in primes работает за O(1).
Шаг 3. Пишем основной цикл.
cnt = 0
best = 0
for i in range(len(nums) - 1):
a, b = nums[i], nums[i+1]
if all_digits_prime(a) and all_digits_prime(b) and (a + b) % 13 == 0:
cnt += 1
if a + b > best:
best = a + b
print(cnt, best)
Шаг 4. Проверяем себя.
- Диапазон индексов
range(len(nums) - 1)— это от 0 до 9998 включительно, приi = 9998берём пару(nums[9998], nums[9999])— последняя пара. Не выходим за границы cnt = 0,best = 0— если подходящих пар нет, выведем0 0. Если нужно выводить «не найдено» — замениbest = 0наbest = None- Условие на цифры: число
257подходит (все цифры из {2, 3, 5, 7}), число20— нет (цифра0не простая)
Код работает за O(N) — для 10 000 чисел это меньше 100 мс. Точно уложишься в лимит времени на экзамене.
Ещё один пример: простые числа с нужной суммой цифр
Условие. В файле — 10000 целых чисел. Найди количество чисел, которые одновременно: простые, и сумма их цифр больше 15.
def is_prime(n):
if n < 2:
return False
if n < 4:
return True
if n % 2 == 0:
return False
i = 3
while i * i <= n:
if n % i == 0:
return False
i += 2
return True
def digit_sum(n):
return sum(int(c) for c in str(n))
with open('17.txt') as f:
nums = [int(x) for x in f]
result = sum(1 for n in nums if is_prime(n) and digit_sum(n) > 15)
print(result)
12 строк — полный ответ. Никакой магии, только честное чтение условия.
Типичные ошибки
Ошибка 1: неверная граница. for i in range(len(nums)) вместо range(len(nums) - 1) при работе с парами → получишь IndexError на последней итерации. Всегда вычитай -1 для пар, -2 для троек.
Ошибка 2: забыл одно из условий. В задаче четыре условия, в коде — три. Перечитывай формулировку после написания кода и отмечай каждое условие галочкой.
Ошибка 3: перепутал «и» и «или». Условие «число делится на 3 или на 5» — это n % 3 == 0 or n % 5 == 0, а не and. Внимательно читай союзы.
Ошибка 4: считаешь пары как (nums[i-1], nums[i+1]). Соседние — это именно nums[i] и nums[i+1]. Не перепрыгивай через число.
Ошибка 5: используешь int(x.strip()) и т.п. int() сам справляется с пробелами и \n. Лишние вызовы просто замедляют код и добавляют шанс опечатки.
Ошибка 6: путаешь == 0 и != 0. «Не делится на 4» → n % 4 != 0, а не n % 4 == 0. Банально, но сдаёт каждый десятый.
Ошибка 7: начальное значение максимума слишком маленькое или большое. Если инициализируешь best = 0, а в задаче встречаются отрицательные числа — получишь неверный ответ. Безопаснее best = None с явной проверкой на первый найденный элемент.
Полный список «предательских» мелочей, на которых валятся даже сильные ученики — в статье Топ-5 ошибок на ЕГЭ по информатике.
Тайминг
Задание 17 — базовый уровень, 1 первичный балл, ориентир 5-8 минут:
- 1-2 мин — читаешь условие, выделяешь все условия на число
- 2-3 мин — пишешь код (чтение файла + цикл + вывод)
- 1 мин — запускаешь, смотришь результат
- 1-2 мин — перепроверяешь формулировку и записываешь в бланк
Если ты застрял на задании 17 дольше 10 минут — пропусти и вернись в конце. На экзамене встречаются задания и подороже — 26 и 27 по 2 балла. Если ты перфекционист в 17 и не успел до 27 — это плохая стратегия. Как распределить внимание на экзамене — в инструкции к 90+.
Как тренироваться
- Научись читать файл за 10 секунд. Выработай пальцевую память на шаблон
with open(...) as f: nums = [int(x) for x in f]. Это стартовые две строки любой задачи 17 - Собери личный справочник условий. Выпиши все варианты фильтров (делимость, цифры, палиндромы, простота) в одном файле. Перед экзаменом — быстрый повтор
- Тренируйся на разных метриках. Один день — количество, другой — сумма, третий — максимум. Смена метрики заставляет не переписывать шаблон, а уверенно его модифицировать
- Обрабатывай пары и тройки. В последние годы ФИПИ любит включать хотя бы одну подзадачу с парами — готовься
- Прогоняй чужие решения. Открой разбор демоверсии и прочитай код, который написал автор. Это быстро расширит набор приёмов
В TuteMe собрана большая библиотека задач 17 с автогенерацией: разные условия, разный размер файла, разные метрики. После каждой попытки показывается эталон и время, за которое ты решил задачу — удобно ловить и ошибки, и тайминг.
Если готовишься с нуля — начни с пошагового плана. Для прокачки чисто питоновских приёмов (срезы, генераторы, @lru_cache) — подборка идиом.