Задание 17: обработка числовой последовательности из файла
Учимся читать числа из файла и отвечать на вопросы вида «сколько чисел удовлетворяют условию и какое из них наибольшее».
Задание 17 — это «программирование на разогрев»: один проход по числам с фильтром и накоплением счётчика, суммы или максимума.
Что проверяет задание 17
Задание 17 — повышенный уровень, 1 балл, первое задание блока программирования. К ЕГЭ прилагается файл (например, 17.txt или 17.csv) с целыми числами. Нужно ответить на вопрос про числа, удовлетворяющие нескольким условиям: «Сколько чисел кратны 3 и больше среднего? Какое из них максимальное?» Часто условие двухчастное: сначала отбираем подмножество, потом считаем по нему количество и экстремум.
Теория: схема «фильтр + накопление»
Почти все варианты решаются по одной схеме:
- Прочитать все числа в список.
- При необходимости заранее посчитать «глобальную» величину (например, среднее всех чисел).
- Пройти по числам, отобрать подходящие под условие.
- Посчитать ответ: количество, сумму, максимум, минимум подмножества.
Главная тонкость — порядок: если условие зависит от среднего, среднее надо вычислить ДО фильтра, по всем числам.
Чтение чисел из файла
На экзамене вы открываете реальный файл так:
with open("17.txt") as f:
data = [int(x) for x in f.read().split()]
Здесь split() разбивает по любым пробелам и переводам строк, а int превращает текст в число. Если числа в одну строку через запятую — используйте split(",").
Разбор примера
Дан список чисел (в браузере имитируем содержимое файла). Условие: посчитать количество чисел, которые кратны 3 и одновременно больше среднего арифметического всех чисел; вывести наибольшее из таких чисел.
Решение на Python
# Имитация содержимого файла 17.txt
data = [45, 12, 89, 23, 7, 100, 56, 34, 78, 90, 11, 67]
# 1) Глобальная величина — среднее ВСЕХ чисел (до фильтра)
avg = sum(data) / len(data)
# 2) Фильтр: кратны 3 И больше среднего
selected = [x for x in data if x % 3 == 0 and x > avg]
# 3) Ответы
print("Среднее:", round(avg, 2))
print("Количество подходящих:", len(selected))
print("Максимум среди них:", max(selected))
Вывод:
Среднее: 51.0 Количество подходящих: 2 Максимум среди них: 90
Среднее = 51,0. Кратны 3: 45, 12, 78, 90, 56(нет), … из них больше 51 — это 78 и 90. Их два, максимум — 90. На экзамене список заменяется чтением файла, остальное не меняется.
Вариант с парами соседних чисел
Иногда условие связывает соседние числа: «сколько пар соседних чисел, сумма которых чётна». Тогда идём по индексам и смотрим на пару data[i], data[i+1].
data = [4, 7, 9, 2, 6, 6, 3, 8]
count = 0
for i in range(len(data) - 1):
if (data[i] + data[i + 1]) % 2 == 0: # сумма пары чётна
count += 1
print("Пар с чётной суммой:", count)
Вывод:
Пар с чётной суммой: 3
Сумма двух чисел чётна, когда оба чётные или оба нечётные. В нашем списке такими оказались три соседние пары. Идея «смотреть на пару соседей» появляется и в других вариантах: «сколько соседних пар, где второе больше первого», «сколько раз подряд число увеличивается». Везде один и тот же каркас — цикл по индексам до предпоследнего элемента.
Двухпроходная схема: сначала статистика, потом ответ
Когда условие зависит от величины, которую саму надо посчитать (среднее, минимум, максимум, сумма всех), удобно делать два прохода. Первый — собрать статистику, второй — применить условие. Пример: «сколько чисел отличаются от среднего не более чем на 10».
data = [40, 55, 48, 70, 12, 51, 49, 88, 53, 47]
avg = sum(data) / len(data) # первый проход: статистика
near = [x for x in data if abs(x - avg) <= 10] # второй проход: фильтр
print("Среднее:", round(avg, 1))
print("Близких к среднему (±10):", len(near))
print("Сумма близких:", sum(near))
Вывод:
Среднее: 51.3 Близких к среднему (±10): 6 Сумма близких: 303
Функция abs даёт модуль разности, поэтому одним условием ловим отклонения в обе стороны. Двухпроходная схема надёжна: пока не посчитано среднее, фильтровать рано.
Типичные ошибки
- Считают среднее после фильтра. Если условие «больше среднего ВСЕХ чисел», среднее берут до отбора.
- Пустой фильтр. Если под условие ничего не подошло,
max([])упадёт; учитывайте такой случай, если он возможен в варианте. - Неверное чтение файла. Числа через запятую и через пробел читаются по-разному; смотрите формат.
- Путают количество и сумму. Внимательно читайте, что спрашивают: число элементов или их сумму/максимум.
Итог
- Схема: прочитать числа → посчитать глобальное (среднее) → отфильтровать → посчитать количество/максимум.
- Среднее, от которого зависит условие, вычисляют по всем числам ДО фильтрации.
- Чтение файла:
[int(x) for x in f.read().split()].