Задание №17 ЕГЭ по информатике: разбор, шаблоны кода Python и анти-примеры | СмартКИМ
СмартКИМ УДОБНАЯ ПОДГОТОВКА К ЕГЭ И ОГЭ
Задачи №17 Решать в тренажере Войти в СмартКИМ
ЕГЭ (1–27) ОГЭ (1–15) Python: шпаргалка
Быстрый переход по номерам и темам
Базовый / Средний (1 балл) Время: 3-5 мин Python 3 open('17.txt') Генераторы списков Срезы пар (a, b) и троек (a, b, c) Все задачи №{ topic_num } в каталоге

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

Тема: Поиск пар и троек элементов с условиями на остатки, квадраты, сумму и делимость
Одно из самых надежных и простых заданий на 1 первичный балл. В файле содержится последовательность до 10 000 целых чисел (как положительных, так и отрицательных!). Требуется найти количество подходящих пар или троек соседних элементов и определить экстремум (максимум или минимум) их сумм.

1. Главная ловушка Задания 17: Отрицательные числа и остатки в Python!

В файле Задания 17 практически всегда присутствуют отрицательные числа (например, -23, -175). В математике и Python операция взятия остатка от деления отрицательного числа работает нестандартно:

  • -23 % 10 == 7 (а не 3!). Если вы напишете if x % 10 == 3:, вы потеряете все отрицательные числа, оканчивающиеся на 3!
  • Золотое правило ЕГЭ: При проверке последней цифры или двух последних цифр ВСЕГДА используйте модуль числа abs(x):
    abs(x) % 10 == 3 (оканчивается на 3)
    abs(x) % 100 == 19 (оканчивается на 19)
    len(str(abs(x))) == 3 (является трехзначным числом)

2. Элегантная проверка логических условий:

Условие в задаче Как записать на Python Пояснение
Ровно один из двух (XOR) (condA) != (condB) True != False дает True
Хотя бы один из двух (OR) condA or condB Логическое ИЛИ
Хотя бы два из трех sum([c1, c2, c3]) >= 2 True приводится к 1
Ровно два из трех sum([c1, c2, c3]) == 2 Сумма булевых флагов

3. Пошаговый алгоритм решения:

  1. Считываем массив целых чисел: nums = [int(x) for x in open('17.txt') if x.strip()].
  2. Находим глобальную константу файла (например, максимальный элемент, оканчивающийся на 15: max_15 = max(x for x in nums if abs(x) % 100 == 15)).
  3. Заводим список valid_sums = [] для сумм подошедших пар.
  4. Проходим циклом по индексам for i in range(len(nums) - 1): (или - 2 для троек).
  5. Печатаем print(len(valid_sums), max(valid_sums)).

Разновидности и прототипы задания на экзамене

Тип 1: Пары соседних элементов с условием на последнюю цифру / делимость
Ровно один элемент оканчивается на определенную цифру или кратен K, а сумма пары удовлетворяет ограничению.
Тип 2: Тройки соседних элементов (хотя бы два из трех / ровно один)
Проверка условий для трех подряд идущих элементов (nums[i], nums[i+1], nums[i+2]) через sum([c1, c2, c3]).
Тип 3: Сравнение с глобальной константой файла (максимум / минимум с условием)
Предварительный проход по файлу для поиска максимального элемента, удовлетворяющего условию (например, оканчивающегося на 19).
Тип 4: Поиск минимальной суммы и нестандартные остатки от деления
Условия на квадраты сумм, сравнение с суммой цифр и фильтрация отрицательных чисел.

Боевой шаблон решения на Python

Запустить код в онлайн-песочнице
# === Универсальный боевой шаблон Задания №17 на Python ===

# 1. Читаем все числа из прикрепленного файла (open('17.txt')):
with open('17.txt') as f:
    nums = [int(x) for x in f if x.strip()]

# 2. Находим ключевую константу задачи:
# Пример: максимальный элемент последовательности, оканчивающийся на 19
max_val = max(x for x in nums if abs(x) % 100 == 19)

valid_sums = []

# 3. Перебираем все пары соседних элементов (nums[i], nums[i+1]):
for i in range(len(nums) - 1):
    a, b = nums[i], nums[i + 1]
    
    # Условие 1: ровно один элемент пары оканчивается на 19
    cond1 = (abs(a) % 100 == 19) != (abs(b) % 100 == 19)
    
    # Условие 2: сумма квадратов элементов не превышает квадрат константы
    cond2 = (a**2 + b**2) <= (max_val**2)
    
    if cond1 and cond2:
        valid_sums.append(a + b)

# Ответ на задание: количество пар и максимальная сумма
print("Количество пар:", len(valid_sums))
print("Максимальная сумма:", max(valid_sums))

Анти-примеры (Типичные ошибки vs Как делать правильно)

Как делать НЕ надо:
Ошибка: x % 10 == 3 для отрицательных чисел
В Python -23 % 10 == 7. Программа не найдет отрицательные числа, оканчивающиеся на 3!
Как делать ПРАВИЛЬНО:
Правильно: Всегда брать модуль abs(x) перед взятием остатка: abs(x) % 10 == 3
Как делать НЕ надо:
Ошибка: range(len(nums)) при проверке пар
На последней итерации nums[i+1] вызовет IndexError: list index out of range!
Как делать ПРАВИЛЬНО:
Правильно: Для пар range(len(nums) - 1), для троек range(len(nums) - 2)
Как делать НЕ надо:
Ошибка: a**2 + b**2 <= max_val (забыли возвести max_val в квадрат)
В условии часто сказано 'квадрат максимального элемента'. Не забывайте max_val**2!
Как делать ПРАВИЛЬНО:
Правильно: Внимательно читайте условие: (a**2 + b**2) <= (max_val**2)
ГРОБ

ГРОБ №17: Тройки с условием на тупоугольный треугольник и отрицательные числа

Дана тройка чисел. Квадрат наибольшего из трех чисел должен быть строго больше суммы квадратов двух других.

Как обойти ловушку: Сортируйте саму тройку на каждой итерации: `x, y, z = sorted([a, b, c])`. Тогда условие запишется элементарно: `z**2 > (x**2 + y**2)`.

Лайфхаки и подводные камни на экзамене:

  • Подсчет количества условий через `sum([c1, c2, c3])` заменяет 8 строк вложенных `if / else` на одну строку!
  • Условие 'ровно один из двух' пишется в 1 оператор: `(cond1) != (cond2)`.
  • Для поиска минимальной суммы используйте `min(valid_sums)`.
Банк реальных задач №17 Открыть в тренажере СмартКИМ