Задание 17: Программирование. Обработка числовых последовательностей
1. Общая информация о задании
- Уровень сложности: базовый (Часть 1)
- Максимальный балл: 1
- Формат на экзамене: файл
.txtс числами (каждое на новой строке), ответ — два числа через пробел
Ответ всегда состоит из двух чисел:
- Количество найденных пар / троек
- Максимальная или минимальная сумма / произведение / иная характеристика таких пар / троек
Внимательно читать условие: иногда нужен
min, а неmax, и характеристика — не сумма, а произведение.
Задания: N17. Числа из файла
2. Считывание данных из файла
Во всех задачах файл считывается целиком в список одной строкой:
f = open('17.txt')
a = [int(s) for s in f]
После этого a это обычный список целых чисел, с которым работаем через индексы.
3. Структура решения
Все задачи решаются по одной схеме:
1. Считать файл в список a
2. Найти вспомогательное значение по всему списку (если нужно)
3. Перебрать пары / тройки, собрать подходящие значения
4. Вывести len(...) и max(...) или min(...)
Структура для пар
f = open('17.txt')
a = [int(s) for s in f]
sum_par = []
for i in range(len(a) - 1): # до предпоследнего включительно
if условие(a[i], a[i+1]):
sum_par.append(a[i] + a[i+1])
print(len(sum_par), max(sum_par))
Структура для троек
f = open('17.txt')
a = [int(s) for s in f]
sum_tri = []
for i in range(len(a) - 2): # до третьего с конца включительно
if условие(a[i], a[i+1], a[i+2]):
sum_tri.append(значение_тройки)
print(len(sum_tri), max(sum_tri))
4. Двухпроходное решение
Если условие зависит от всего списка (минимум, максимум, какой-то особый элемент) — сначала находим это значение, потом ищем пары / тройки.
Паттерн: найти минимальный / максимальный элемент по условию
# Способ 1: через список в min / max
candidates = []
for x in a:
if условие(x):
candidates.append(x)
result = min(candidates) # или max(candidates)
# Способ 2: компактно через генератор (то же самое)
result = min(x for x in a if условие(x))
5. Проверка условий на элементы
5.1. Остаток от деления (последние цифры)
| Что проверяем | Код |
|---|---|
| Кратность числу k | x % k == 0 |
| Остаток равен r | x % k == r |
| Последняя цифра | abs(x) % 10 |
| Последние две цифры | abs(x) % 100 == 25 |
| Последняя цифра в СС по основанию b | x % b |
Важно:
str(x)[-2:]работает только для положительных чисел. Для отрицательных безопасный вариант —abs(x) % 100 == 25.
5.2. Количество цифр (N-значное число)
len(str(abs(x))) == 4 # четырёхзначное
len(str(abs(x))) == 3 # трёхзначное
# То же самое через неравенства:
1000 <= abs(x) <= 9999 # четырёхзначное
100 <= abs(x) <= 999 # трёхзначное
5.3. Комбинированное условие
Проверка сразу двух свойств через and:
# Трёхзначное И оканчивается на 15
str(x)[-2:] == '15' and len(str(abs(x))) == 3
# Через остатки (надежнее для отрицательных):
abs(x) % 100 == 15 and 100 <= abs(x) <= 999
5.4. Проверка «хотя бы один» через or
# Хотя бы одно из двух кратно mn23
a[i] % mn23 == 0 or a[i+1] % mn23 == 0
# Хотя бы один остаток от /16 равен min(a)
a[i] % 16 == mn or a[i+1] % 16 == mn
5.5. Проверка знака всех элементов тройки
# Все три положительные ИЛИ все три отрицательные
(a[i] > 0 and a[i+1] > 0 and a[i+2] > 0) or \
(a[i] < 0 and a[i+1] < 0 and a[i+2] < 0)
5.7. Разность и абсолютное значение
abs(a[i] - a[i+1]) % mn35 == 0 # |разность| кратна mn35
a[i] != a[i+1] # элементы не равны
6. Что добавлять в список: сумма или другая характеристика
Не всегда добавляем сумму. Где-то нужно произведение min × max тройки:
# Сумма пары:
sum_par.append(a[i] + a[i+1])
# Сумма тройки:
sum_tri.append(a[i] + a[i+1] + a[i+2])
# Произведение min и max тройки:
umn_tri.append(max(a[i:i+3]) * min(a[i:i+3]))
a[i:i+3] - срез списка из трёх элементов: [a[i], a[i+1], a[i+2]].
К срезу можно применять max(), min(), sum() напрямую.
7. Справочник: списки, генераторы, срезы
Создание списка из файла
| Способ | Код |
|---|---|
| Построчно в список | a = [int(s) for s in open('17.txt')] |
Через readlines() |
a = [int(x) for x in open('17.txt').readlines()] |
Операции со списком a
| Что делаем | Код |
|---|---|
| Длина | len(a) |
| Минимум | min(a) |
| Максимум | max(a) |
| Сумма | sum(a) |
| Элемент по индексу | a[i] |
| Добавить элемент | a.append(x) |
Срезы (slices)
| Что делаем | Код |
|---|---|
| Элементы с i до j (не включая j) | a[i:j] |
| Тройка начиная с i | a[i:i+3] |
| Последние два символа строки | str(x)[-2:] |
| Минимум тройки | min(a[i:i+3]) |
| Максимум тройки | max(a[i:i+3]) |
| Сумма тройки | sum(a[i:i+3]) |
Генераторы (выражения внутри min / max / sum)
min(x for x in a if x > 0) # минимальный положительный
max(x for x in a if abs(x) % 100 == 25) # максимальный, оканчивается на 25
sum(x for x in a if x % 2 == 0) # сумма чётных
[x for x in a if x > 0] # список положительных
Генератор — это (выражение for переменная in последовательность if условие).
Условие if необязательно.
Встроенные функции
| Функция | Пример | Что возвращает |
|---|---|---|
abs(x) |
abs(-325) → 325 |
Модуль числа |
len(x) |
len([1,2,3]) → 3 |
Длина |
str(x) |
str(325) → '325' |
Строка |
int(x) |
int('42') → 42 |
Целое число |
min(a) |
min([3,1,2]) → 1 |
Минимум |
max(a) |
max([3,1,2]) → 3 |
Максимум |
sum(a) |
sum([1,2,3]) → 6 |
Сумма |
range(n) |
range(5) → 0,1,2,3,4 |
Диапазон |
8. Типичные ошибки
| Ошибка | Как избежать |
|---|---|
min(a) или min(x for ...) внутри цикла — пересчитывается каждый раз |
Вычислить вспомогательное значение до цикла |
str(x)[-2:] для отрицательных чисел |
Использовать abs(x) % 100 == 15 |
len(str(x)) == 3 для отрицательного числа |
Использовать len(str(abs(x))) == 3 |
Не убрать отладочный print(min15) перед сдачей |
Удалить все промежуточные print из финального кода |
max(sum_par) когда по условию нужен min |
Читать условие внимательно: «минимальное из произведений» → min() |
max(umn_tri) падает, если список пуст |
Убедиться, что подходящие тройки есть (как правило, гарантируется) |
range(len(a)) вместо range(len(a) - 1) для пар |
Для пар: -1, для троек: -2 |
9. Краткий чек-лист
- Считать файл:
a = [int(s) for s in open('17.txt')] - Нужна ли вспомогательная характеристика? найти до цикла
- Пары
range(len(a) - 1), тройкиrange(len(a) - 2) - Что собираем: сумму, произведение min×max или другое?
res.append(...) - Для отрицательных чисел:
abs()при проверке цифр и остатков maxилиminв ответе? читать условие- Вывести:
print(len(res), max(res))илиprint(len(res), min(res))