Задание 17
Обработка числовой последовательности
Файл в список и условие в проверки: соседние пары и тройки, «не более двух из трёх», цифры отрицательных чисел, порог по всей последовательности и длинные формулировки.
7 подтем · 40 задач + 4 дополнительные · повышенный · ≈ 13 мин
Подтема 1 из 7
Файл и условие
Что спрашивают в задании 17, как прочитать файл в список и записать слова условия проверками Python.
Как устроена тема
В задании 17 дают файл с последовательностью целых чисел — обычно их около десяти тысяч. Нужно найти соседние пары или тройки чисел, которые подходят под условие, и записать в ответ два числа: сколько таких групп и какая у них наибольшая или наименьшая сумма. Вот задача, которую мы будем решать всю тему:
«В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от −100 000 до 100 000 включительно. Определите количество троек элементов последовательности, в которых не более двух из трёх элементов являются четырёхзначными числами, а сумма элементов тройки не больше максимального элемента последовательности, оканчивающегося на 25. В ответе запишите количество найденных троек чисел, затем максимальную из сумм элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.»
Десять тысяч чисел вручную не проверить — задание решают программой. Но каждый её шаг мы сначала проверим руками на восьми числах: 125, 1300, −1250, −2100, 7, −325, 2025, 3000. Сначала разберём, что сказано в условии:
| В условии | Что это значит |
|---|---|
| последовательность целых чисел | числа записаны в файле по порядку, по одному в строке |
| от −100 000 до 100 000 | среди чисел есть отрицательные |
| тройка — три идущих подряд элемента | 125, 1300, −1250; затем 1300, −1250, −2100; и так далее |
| не более двух из трёх — четырёхзначные | четырёхзначных чисел в тройке 0, 1 или 2, но не 3 |
| максимальный элемент, оканчивающийся на 25 | порог: его находят по всей последовательности |
| сумма тройки не больше порога | сумма ≤ порога |
| количество троек, затем максимальную из сумм | ответ — два числа через пробел |
Тема состоит из шести подтем и дополнительного урока — у каждой своя страница. Идём по ним по порядку:
- Файл и условие — ты сейчас здесь: список, файл и первые проверки.
- Соседние пары и тройки — перебираем тройки и собираем количество и наибольшую сумму.
- Сколько чисел группы подходит — «не более двух из трёх», «хотя бы одно», «ровно одно».
- Цифры и знак числа — «оканчивается на 25» у отрицательных чисел.
- Порог по всей последовательности — решим задачу темы целиком: ответ 8358 99821.
- Длинные формулировки — квадрат минимума, остаток минимального, два наибольших.
- Тройка как стороны треугольника — дополнительный урок для редких задач.
Список и индексы
Как хранить в программе восемь чисел и обратиться к любому из них?
Последовательность хранят в . Номер места в списке называют индексом, и считают его с нуля. Вот восемь чисел темы и их индексы:
a[0], последний 3000 — a[7]: индекс на единицу меньше обычного номера.В программе список записывают в квадратных скобках через запятую:
a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000]Количество элементов даёт . У нас n = len(a) = 8, индексы идут от 0 до n − 1 = 7, и последний элемент — a[n - 1]:
a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000]n = len(a)print(n, a[0], a[1], a[n - 1])Элемента a[8] нет: обращение к нему остановит программу ошибкой.
Элемент — это число на своём месте. Если в файле дважды встречается 7, это два разных элемента. Переставлять числа тоже нельзя: от порядка зависит, какие числа стоят рядом.
Файл в список
Как получить такой список из файла?
Файл открывают, проходят по его строкам и каждую строку переводят в число. В файле 17.txt числа записаны по одному в строке. Для программы строка «−43867» — это текст: сравнивать или делить её как число нельзя. Переводит текст в число :
with open("17.txt") as f: a = [int(x) for x in f]print(len(a), a[0], a[1]) открывает файл, а with закрывает его, когда чтение закончено. Запись [int(x) for x in f] читай так: для каждой строки x файла взять int(x) и собрать результаты в список. Такую запись называют .
Файл должен лежать в той же папке, что и программа. Если он в другом месте, в open пишут полный путь, например open("C:/ege/17.txt").
Условие — проверки
Как записать слова условия на Python?
Каждое требование условия — проверка: она даёт True, если требование выполнено, и False, если нет. Например, «сумма тройки не больше 2025» — это s <= 2025. Знаки : == (равно), != (не равно), >, <, >=, <=.
Не путай x = 10 и x == 10: первое присваивает значение, второе проверяет равенство.
Слова условия переводят буквально. Выбери формулировку:
- больше 100
x > 100- не меньше 100
x >= 100«не меньше» включает само 100- меньше 100
x < 100- не больше 100
x <= 100«не больше» и «не превышает» включают 100- от 100 до 999 включительно
100 <= x <= 999то же, что100 <= x and x <= 999
Чтобы выполнить действие только тогда, когда проверка дала True, пишут . Как это работает, покажет следующий раздел.
Кратность и остаток
Как проверить, что число делится на другое?
Число x кратно d, когда остаток от деления x на d равен нулю: x % d == 0. Знак % даёт остаток, а — целую часть частного. Например, 23 = 4 · 5 + 3:
print(23 // 5, 23 % 5)Все проверки делимости устроены так же:
- число кратно 3
x % 3 == 0- число не кратно 3
x % 3 != 0- число чётное
x % 2 == 0- число нечётное
x % 2 != 0- остаток от деления на 7 равен 4
x % 7 == 4
Ноль кратен любому числу: 0 % 25 равно 0. Если нужны положительные кратные, добавь x > 0.
Посчитаем, сколько из восьми чисел темы кратны 25 и сколько из них положительные. Цикл по очереди берёт каждый элемент, а растёт на каждом подходящем:
a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000]count = 0positive = 0for x in a: if x % 25 == 0: count += 1 if x > 0: positive += 1print(count, positive)Кратны 25 все числа, кроме 7. Положительных среди них четыре: 125, 1300, 2025, 3000.
Сумма и произведение
Условие говорит про сумму тройки — что проверять?
Условие на сумму или произведение проверяют у самой суммы или произведения, а не у каждого числа. Сумма 2 + 5 = 7 кратна семи, хотя ни 2, ни 5 на семь не делятся. Произведение 2 · 5 = 10 кратно десяти, хотя ни одно из чисел не кратно:
x = 2y = 5print((x + y) % 7 == 0, x % 7 == 0 and y % 7 == 0)print((x * y) % 10 == 0, x % 10 == 0 or y % 10 == 0)Другие выражения, которые встречаются в условиях:
- сумма тройки
x + y + z- произведение
x * y- модуль разности
abs(x - y)насколько числа отличаются, без знака- квадрат числа
x ** 2степень —**, знак^не подходит- сумма квадратов
x ** 2 + y ** 2для 3 и 4: 9 + 16 = 25- квадрат суммы
(x + y) ** 2для 3 и 4: 7² = 49
возвращает модуль — число без знака:
print(abs(-1250), abs(1250), abs(0), abs(3 - 8))Итого
- Списокиндексы от
a[0]доa[n - 1],n = len(a) - Файл
a = [int(x) for x in f] - Сравнения«не больше» —
<=, «не меньше» —>= - Кратность
x % d == 0, ноль кратен любому числу - Счётчик
count = 0, затемcount += 1на подходящем - Суммаусловие на сумму проверяют у самой суммы
Проверьте себя
Ответь сначала сам, потом открой ответ.
a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000] какой индекс у числа −325? Как обратиться к последнему элементу через n = len(a)?ОтветСкрыть ответ
a[n - 1], то есть a[7] = 3000.ОтветСкрыть ответ
x >= 50, x < -5, -99 <= x <= 99, x <= 0.ОтветСкрыть ответ
ОтветСкрыть ответ
int(x) проверка x % 25 == 0 для чисел из файла не сработает?ОтветСкрыть ответ
"125\n". Делить текст с остатком нельзя: Python остановится с ошибкой. Сначала строку переводят в число.Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Длина и края списка
В файле 17-1.txt содержится последовательность целых чисел, по одному в строке. Определите количество чисел в файле, затем сумму первого и последнего чисел.
Введите через пробел количество чисел, затем сумму первого и последнего.
Подсказка
Последний элемент — a[len(a) - 1]: индексы начинаются с нуля.
Решение
Файл читается в список, длину даёт len, первый элемент — a[0], последний — a[len(a) - 1].
with open("17-1.txt") as f: a = [int(x) for x in f]print(len(a), a[0] + a[len(a) - 1])Ответ: 1000 -4465
Делится на 4, но не на 8
Для файла 17-1.txt определите количество чисел, которые делятся на 4, но не делятся на 8, затем количество чисел от −100 до 100 включительно. В ответе запишите два числа.
Введите через пробел количество чисел, кратных 4, но не 8, затем количество чисел от −100 до 100.
Подсказка
Каждое слово условия — своя проверка: x % 4 == 0 and x % 8 != 0, затем двойное неравенство.
Решение
«Делится на 4, но не на 8» — x % 4 == 0 and x % 8 != 0, «от −100 до 100 включительно» — -100 <= x <= 100.
with open("17-1.txt") as f: a = [int(x) for x in f]first = 0second = 0for x in a: if x % 4 == 0 and x % 8 != 0: first += 1 if -100 <= x <= 100: second += 1print(first, second)Ответ: 145 324
Кратные девяти и положительные
В файле 17-1.txt содержится последовательность целых чисел, каждое от −10 000 до 10 000 включительно. Определите количество чисел, кратных 9, затем количество положительных чисел, кратных 9. В ответе запишите два числа.
Введите через пробел количество кратных 9, затем количество положительных кратных 9.
Подсказка
Кратность — x % 9 == 0. Ноль и отрицательные кратные входят только в первое количество.
Решение
Первый счётчик растёт на каждом кратном девяти, второй — только на положительном из них.
with open("17-1.txt") as f: a = [int(x) for x in f]count = 0positive = 0for x in a: if x % 9 == 0: count += 1 if x > 0: positive += 1print(count, positive)Ответ: 111 48
Сумма квадратов и квадрат суммы
Для чисел 2 и 7 найди сумму квадратов и квадрат суммы.
Введите через пробел сумму квадратов, затем квадрат суммы.
Подсказка
Сумма квадратов — сначала возвести каждое число в квадрат, квадрат суммы — сначала сложить.
Решение
4 + 49 = 53, а (2 + 7)² = 9² = 81.
x, y = 2, 7print(x ** 2 + y ** 2, (x + y) ** 2)Ответ: 53 81