5 мин чтения

Как решать задание 17 ЕГЭ по информатике — обработка массива чисел на Python

Разбор задания 17 ЕГЭ по информатике: чтение файла, условия на числа, сумма цифр, простые числа, палиндромы. Шаблоны решений на Python и типичные ошибки.

О чём задание

Задание 17 КЕГЭ — обработка массива целых чисел из файла. Вход всегда один и тот же: текстовый файл (обычно 17.txt), в каждой строке — одно целое число. Количество чисел — до 10 000. Твоя задача — пройтись по массиву, отобрать числа (или пары/тройки соседних) по условиям из формулировки, и вывести метрику: количество, сумму, максимум, минимум или пару чисел.

Задание базового уровня, стоит 1 первичный балл. В КЕГЭ 2026 на все 27 заданий даётся 235 минут и 29 первичных баллов (1-25 по 1 баллу, 26-27 по 2 балла). Разбор структуры экзамена и всех изменений — в статье про ЕГЭ 2026. Задание 17 — одно из самых стабильных по формату: шаблон решения почти не меняется год от года.

Шаблон решения

Любое решение задания 17 укладывается в четыре шага:

  1. Прочитать файл в список чисел
  2. Определить условие на число (или на пару чисел)
  3. Пройти циклом и посчитать метрику
  4. Вывести ответ

Минимальная версия:

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
делится на Kn % K == 0
не делится на Kn % K != 0
содержит цифру Dstr(D) in str(n)
сумма цифр равна Ssum(int(c) for c in str(n)) == S
сумма цифр меньше Msum(int(c) for c in str(n)) < M
число палиндромstr(n) == str(n)[::-1]
заканчивается на цифру Dn % 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) — подборка идиом.

Попробовать бесплатно →

Частые вопросы

Что именно требуется в задании 17 ЕГЭ по информатике

Дан файл с целыми числами (обычно до 10000 чисел, одно число на строке). Нужно найти количество пар/троек/одиночных чисел, удовлетворяющих условиям, или сумму/максимум/минимум по этим условиям. Типовой набор условий: делится на K, содержит цифру D, сумма цифр меньше M, число простое, число палиндром. Задание базового уровня, стоит 1 первичный балл.

Как правильно прочитать файл с числами

В 99% задач работает такой шаблон:

with open('17.txt') as f:
    nums = [int(x) for x in f]

Одно число на строке → int(x) автоматически отбросит перевод строки. Не используй f.read().split() без нужды — это работает, но у for x in f меньше шансов на ошибку с лишними пробелами.

Сколько времени уходит на задание 17

5-8 минут. Из них 1-2 минуты на чтение условия, 2-3 минуты на написание кода, 1-2 минуты на отладку. Если дольше 10 минут — скорее всего, ты пытаешься писать «красиво» вместо того, чтобы делать в лоб. В КЕГЭ 2026 — 235 минут на 27 заданий, лучше не зависать.

Что если в задаче просят пару соседних чисел

Пройдись по индексам от 0 до len(nums) - 2 и проверяй пары (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
)

Если условие про тройки — индексы до len(nums) - 3 и nums[i], nums[i+1], nums[i+2].

Как быстро проверить число на простоту

Для чисел до 10^6 хватает обычной проверки до корня:

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

Эта функция проверит число за микросекунды. Для 10000 чисел в файле — суммарно меньше секунды.

Как проверить что число палиндром

Переведи число в строку и сравни со своей перевёрнутой копией:

s = str(n)
if s == s[::-1]:
    ...

Одна строка. Работает для любого количества цифр.

Что возвращать если в задаче две метрики: количество и сумма

Просто считай оба значения в одном цикле:

cnt = 0
total = 0
for n in nums:
    if n % 3 == 0 and n > 1000:
        cnt += 1
        total += n
print(cnt, total)

Один проход по массиву покрывает обе метрики — никаких «двух циклов». Точно так же можно держать max, min и всё что угодно.

Какой Python подойдёт для задания 17

Любой Python 3.x, официально на КЕГЭ установлен Python 3.10+. Все приёмы из статьи (генераторы, f-строки, срезы) работают. Если ты ещё не уверен, стоит ли готовиться на Python или перейти на C++, посмотри статью Python или C++ для ЕГЭ — для задания 17 Python удобнее.

Готов применять на практике?

В тренажёре TuteMe — 2000+ заданий ЕГЭ по информатике с автоматической проверкой и подробным разбором. AI-помощник подсказывает, где ты ошибаешься, и подбирает задания под твой уровень.

Начать бесплатно →