ЕГЭ · №17 / Python≈ 5 мин чтенияБесплатно

Задание 17 ЕГЭ: соседние пары и обработка файлов в Python

Как прочитать числовой файл и выбрать подходящие соседние пары? Разберите короткую последовательность, пройдите вычисление по шагам, затем проверьте отрицательные числа и тройки. В статье — программы для скачивания и шесть задач с ответами.

Сразу к самопроверке
Превратить файл в ответ
Превратить файл в ответ · от схемы к решению
ШАГ 01

Читаем условие до написания цикла

Отметьте четыре пункта: какие числа даны; какие элементы объединяются в группу; что делает группу подходящей; что требуется вывести. Соседние пары — это a[0] и a[1], затем a[1] и a[2] и так далее. Перебирать все возможные пары для такого условия не нужно.

В разных заданиях №17 могут быть другие условия: тройки, сравнение со средним, ограничение на сумму или окончание числа. Код из примера ниже решает именно наше условие, а не любое задание с этим номером.

ПОПРОБУЙТЕ САМИ · УЧЕБНЫЙ ПРИМЕР

Проследите каждую соседнюю пару

Условие: ровно одно число из соседней пары делится на 7. Считаем подходящие пары и ищем наибольшую сумму.

1472182810-7
Найдено пар: 0 · максимум: пока нет

Первая пара: 14 и 7. Оба числа делятся на 7 — пропускаем.

ШАГ 02

Учебный пример и файл

В файле записано по одному целому числу в строке. Найдите количество соседних пар, в которых ровно одно число делится на 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 онлайн.

a[0]14a[1]7a[2]21a[3]8a[4]28a[5]10a[6]-7

Условие внутри цикла:

(x % 7 == 0) != (y % 7 == 0)
Проверяем все 6 соседних пар. Группы пересекаются.
ix, yПодходит?СуммаСчётчикМаксимум
014, 7Нет—0None
17, 21Нет—0None
221, 8Да29129
38, 28Да36236
428, 10Да38338
510, −7Да3438

Результат: 4 подходящие пары; максимальная сумма — 38.

↓ Скачать программу Python
ШАГ 03

Рабочая программа 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.

ШАГ 04

«Хотя бы одно» и «ровно одно» — разные условия

Пусть p и q — результаты проверки каждого числа. Тогда:

ФормулировкаПроверка в Python
Оба числа кратны 7p and q
Хотя бы одно кратно 7p or q
Ровно одно кратно 7p != q
Ни одно не кратно 7not p and not q

В коде p — это x % 7 == 0, q — y % 7 == 0. Для пары (14, 7) выражение с or даст True, а с != — False. Именно поэтому простая замена одного оператора меняет ответ.

ШАГ 05

Максимум, отрицательные числа и пустой результат

Не начинайте максимум с нуля: суммы подходящих пар могут быть отрицательными. Например, у пар (−14, −3) и (−3, −7) суммы −17 и −10; максимум — −10, а не 0. Начальное best = None позволяет принять первую подходящую сумму, какой бы она ни была.

Если ни одна пара не подошла, best останется None. В учебной программе выводится понятное сообщение. На экзамене формат ответа выбирайте строго по условию.

Для отрицательного числа, у которого в десятичной записи последняя цифра 7, проверка будет abs(x) % 10 == 7. Это другое свойство: число может оканчиваться на 7 и не делиться на 7.

ШАГ 06

Соседние тройки: что меняется в программе

В последовательности из 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: нужно также взять третий элемент и переписать условие группы.

ШАГ 07

Самостоятельный файл: сначала прогноз, потом запуск

Повторите то же условие «ровно одно число кратно 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.

Закрепить тему

Примени изученный приём на новой задаче.

Решить задачу
Ещё по теме и поделиться
Поделиться: Telegram ВКонтакте
ВАШ ПРЕПОДАВАТЕЛЬНикита Саралашвили

Разберёмся вместе

ОГЭ, ЕГЭ и программирование — от первого вопроса до уверенного решения.

Загружаем стоимость занятий…

Обсудим вашу цель?

Напишите, к чему готовитесь и с чем нужна помощь.

Все условия занятий