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