Задание 17: обработка числовой последовательности из файла

Учимся читать числа из файла и отвечать на вопросы вида «сколько чисел удовлетворяют условию и какое из них наибольшее».

Задание 17 — это «программирование на разогрев»: один проход по числам с фильтром и накоплением счётчика, суммы или максимума.

Что проверяет задание 17

Задание 17 — повышенный уровень, 1 балл, первое задание блока программирования. К ЕГЭ прилагается файл (например, 17.txt или 17.csv) с целыми числами. Нужно ответить на вопрос про числа, удовлетворяющие нескольким условиям: «Сколько чисел кратны 3 и больше среднего? Какое из них максимальное?» Часто условие двухчастное: сначала отбираем подмножество, потом считаем по нему количество и экстремум.

Теория: схема «фильтр + накопление»

Почти все варианты решаются по одной схеме:

  1. Прочитать все числа в список.
  2. При необходимости заранее посчитать «глобальную» величину (например, среднее всех чисел).
  3. Пройти по числам, отобрать подходящие под условие.
  4. Посчитать ответ: количество, сумму, максимум, минимум подмножества.

Главная тонкость — порядок: если условие зависит от среднего, среднее надо вычислить ДО фильтра, по всем числам.

Чтение чисел из файла

На экзамене вы открываете реальный файл так:

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()].
Проверьте себя
1. Условие: «числа, большие среднего арифметического всех чисел». Когда считать среднее?
AПосле отбора подходящих чисел
BПо всем числам ДО фильтрации
CТолько по первым десяти числам
DСреднее не нужно
2. Как прочитать целые числа из файла, записанные через пробелы и переводы строк?
Af.read()
B[int(x) for x in f.read().split()]
Cint(f.read())
Df.readlines()
3. Что вернёт max(selected), если ни одно число не прошло фильтр?
A0
BВызовет ошибку, потому что список пуст
CNone
DСреднее
Поддержать проект