Задание 17 ЕГЭ: соседние пары и обработка файлов в Python
Как прочитать числовой файл и выбрать подходящие соседние пары? Разберите короткую последовательность, пройдите вычисление по шагам, затем проверьте отрицательные числа и тройки. В статье — программы для скачивания и шесть задач с ответами.
Сразу к самопроверкеЧитаем условие до написания цикла
Отметьте четыре пункта: какие числа даны; какие элементы объединяются в группу; что делает группу подходящей; что требуется вывести. Соседние пары — это a[0] и a[1], затем a[1] и a[2] и так далее. Перебирать все возможные пары для такого условия не нужно.
В разных заданиях №17 могут быть другие условия: тройки, сравнение со средним, ограничение на сумму или окончание числа. Код из примера ниже решает именно наше условие, а не любое задание с этим номером.
Проследите каждую соседнюю пару
Условие: ровно одно число из соседней пары делится на 7. Считаем подходящие пары и ищем наибольшую сумму.
Первая пара: 14 и 7. Оба числа делятся на 7 — пропускаем.
Учебный пример и файл
В файле записано по одному целому числу в строке. Найдите количество соседних пар, в которых ровно одно число делится на 7, и максимальную сумму элементов такой пары.
14
7
21
8
28
10
-7Скачать learn-ege-17-example.txt — 7 чисел. Сохраните файл рядом с программой и запускайте её из этой папки либо укажите полный путь к файлу.
| Пара | Ровно одно кратно 7? | Сумма подходящей пары |
|---|---|---|
| 14 и 7 | Нет, оба | — |
| 7 и 21 | Нет, оба | — |
| 21 и 8 | Да | 29 |
| 8 и 28 | Да | 36 |
| 28 и 10 | Да | 38 |
| 10 и −7 | Да | 3 |
Ответ: 4 пары, максимальная сумма 38. Пары перекрываются: число 8 входит и в пару (21, 8), и в пару (8, 28). Это нормально — мы считаем соседние пары, а не выбираем непересекающиеся.
ПОСМОТРИТЕ, КАК МЕНЯЕТСЯ РЕЗУЛЬТАТ
Соседние пары — по одному шагу
Почему пара (14, 7) не подходит, а (21, 8) подходит? Пройдите по последовательности и проследите за счётчиком и максимумом.
Здесь показана пошаговая модель примера. Для запуска собственного кода откройте Python онлайн.
Условие внутри цикла:
(x % 7 == 0) != (y % 7 == 0)| i | x, y | Подходит? | Сумма | Счётчик | Максимум |
|---|---|---|---|---|---|
| 0 | 14, 7 | Нет | — | 0 | None |
| 1 | 7, 21 | Нет | — | 0 | None |
| 2 | 21, 8 | Да | 29 | 1 | 29 |
| 3 | 8, 28 | Да | 36 | 2 | 36 |
| 4 | 28, 10 | Да | 38 | 3 | 38 |
| 5 | 10, −7 | Да | 3 | 4 | 38 |
Результат: 4 подходящие пары; максимальная сумма — 38.
↓ Скачать программу PythonРабочая программа Python
int(line) превращает строку в целое число. Конструкция with закрывает файл после чтения; пустые строки в этом примере пропускаются.
with open("learn-ege-17-example.txt", encoding="utf-8") as f:
a = [int(line) for line in f if line.strip()]
count = 0
best = None
for i in range(len(a) - 1):
x, y = a[i], a[i + 1]
if (x % 7 == 0) != (y % 7 == 0):
total = x + y
count += 1
if best is None or total > best:
best = total
if best is None:
print("Подходящих пар нет")
else:
print(count, best) # 4 38У n элементов ровно n − 1 соседних пар, поэтому цикл идёт по range(len(a) − 1). Последний используемый индекс — len(a) − 1. Выхода за границы списка нет.
Если программа сообщает FileNotFoundError, проверьте имя файла и рабочую папку запуска. О чтении текстовых файлов — в руководстве Python.
«Хотя бы одно» и «ровно одно» — разные условия
Пусть p и q — результаты проверки каждого числа. Тогда:
| Формулировка | Проверка в Python |
|---|---|
| Оба числа кратны 7 | p and q |
| Хотя бы одно кратно 7 | p or q |
| Ровно одно кратно 7 | p != q |
| Ни одно не кратно 7 | not p and not q |
В коде p — это x % 7 == 0, q — y % 7 == 0. Для пары (14, 7) выражение с or даст True, а с != — False. Именно поэтому простая замена одного оператора меняет ответ.
Максимум, отрицательные числа и пустой результат
Не начинайте максимум с нуля: суммы подходящих пар могут быть отрицательными. Например, у пар (−14, −3) и (−3, −7) суммы −17 и −10; максимум — −10, а не 0. Начальное best = None позволяет принять первую подходящую сумму, какой бы она ни была.
Если ни одна пара не подошла, best останется None. В учебной программе выводится понятное сообщение. На экзамене формат ответа выбирайте строго по условию.
Для отрицательного числа, у которого в десятичной записи последняя цифра 7, проверка будет abs(x) % 10 == 7. Это другое свойство: число может оканчиваться на 7 и не делиться на 7.
Соседние тройки: что меняется в программе
В последовательности из n чисел проверяем n − 2 соседние тройки: a[i], a[i + 1], a[i + 2]. Например, для 7, 1, 2, 14, 3 есть три группы: (7, 1, 2), (1, 2, 14), (2, 14, 3).
Пусть условие учебного примера — ровно одно число тройки кратно 7. Каждая проверка возвращает True или False; при сложении это 1 или 0. Сумма трёх проверок должна быть равна 1.
a = [7, 1, 2, 14, 3]
count = 0
best = None
for i in range(len(a) - 2):
x, y, z = a[i], a[i + 1], a[i + 2]
matches = (x % 7 == 0) + (y % 7 == 0) + (z % 7 == 0)
if matches == 1:
total = x + y + z
count += 1
if best is None or total > best:
best = total
print(count, best) # 3 19Все три группы подходят; их суммы 10, 17 и 19. Результат: 3 тройки, максимальная сумма 19. Не меняйте только длину range: нужно также взять третий элемент и переписать условие группы.
Самостоятельный файл: сначала прогноз, потом запуск
Повторите то же условие «ровно одно число кратно 7» для последовательности 5, 14, 21, 4, 7, 9, 28, 2.
Скачать learn-ege-17-practice.txt — 8 чисел. Измените имя в строке open. До запуска выпишите соседние пары и предскажите два числа результата; вопросы ниже помогут проверить каждое.
Проверьте себя
Сначала решите самостоятельно. Затем проверьте ответ или откройте объяснение.
Ответ и объяснение
6. Подходят (5, 14), (21, 4), (4, 7), (7, 9), (9, 28), (28, 2). Пара (14, 21) исключается: оба числа кратны 7.
Ответ и объяснение
37. Суммы подходящих пар: 19, 25, 11, 16, 37 и 30. Максимум — 37 у пары (9, 28).
Ответ и объяснение
6. Тройка начинается с индекса от 0 до 5 включительно. Последняя состоит из элементов с индексами 5, 6, 7. Всего 8 − 2 = 6 троек.
Ответ и объяснение
2. Обе пары (−14, −3) и (−3, −7) подходят. Отрицательный знак не мешает проверке делимости.
Ответ и объяснение
-10. Суммы −17 и −10. Наибольшая — −10. Начальный best = 0 дал бы неверный результат.
Ответ и объяснение
3. (7, 1, 2), (1, 2, 14), (2, 14, 3): в каждой ровно одно кратное 7.