К содержанию

Задание 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порог: его находят по всей последовательности
сумма тройки не больше порогасумма ≤ порога
количество троек, затем максимальную из суммответ — два числа через пробел

Тема состоит из шести подтем и дополнительного урока — у каждой своя страница. Идём по ним по порядку:

  1. Файл и условие — ты сейчас здесь: список, файл и первые проверки.
  2. Соседние пары и тройки — перебираем тройки и собираем количество и наибольшую сумму.
  3. Сколько чисел группы подходит — «не более двух из трёх», «хотя бы одно», «ровно одно».
  4. Цифры и знак числа — «оканчивается на 25» у отрицательных чисел.
  5. Порог по всей последовательности — решим задачу темы целиком: ответ 8358 99821.
  6. Длинные формулировки — квадрат минимума, остаток минимального, два наибольших.
  7. Тройка как стороны треугольника — дополнительный урок для редких задач.

Список и индексы

Как хранить в программе восемь чисел и обратиться к любому из них?

Последовательность хранят в . Номер места в списке называют индексом, и считают его с нуля. Вот восемь чисел темы и их индексы:

Первый элемент 125 — это 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])
8 125 1300 3000

Элемента 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])
10000 -43867 -97180

открывает файл, а 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)
4 3

Все проверки делимости устроены так же:

число кратно 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)
7 4

Кратны 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)
True False True False

Другие выражения, которые встречаются в условиях:

сумма тройки
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))
1250 1250 0 5

Итого

  • Списокиндексы от a[0] до a[n - 1], n = len(a)
  • Файлa = [int(x) for x in f]
  • Сравнения«не больше» — <=, «не меньше» — >=
  • Кратностьx % d == 0, ноль кратен любому числу
  • Счётчикcount = 0, затем count += 1 на подходящем
  • Суммаусловие на сумму проверяют у самой суммы

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
В списке a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000] какой индекс у числа −325? Как обратиться к последнему элементу через n = len(a)?
ОтветСкрыть ответ
Ответ
Индекс 5: счёт идёт с нуля. Последний элемент — a[n - 1], то есть a[7] = 3000.
Вопрос 2
Переведи в проверки Python: «x не меньше 50», «x меньше −5», «x от −99 до 99 включительно», «x не превышает 0».
ОтветСкрыть ответ
Ответ
x >= 50, x < -5, -99 <= x <= 99, x <= 0.
Вопрос 3
Какие из чисел 0, 9, −18, 27, 36, −3 кратны девяти? Какие из них положительные?
ОтветСкрыть ответ
Ответ
Кратны девяти 0, 9, −18, 27, 36; положительные из них — 9, 27, 36. Ноль кратен девяти, но не положителен.
Вопрос 4
Для пары (4, 6): кратна ли пяти сумма? Кратно ли пяти хотя бы одно из чисел? Кратно ли восьми произведение?
ОтветСкрыть ответ
Ответ
Сумма 10 кратна пяти, хотя ни 4, ни 6 на пять не делятся. Произведение 24 кратно восьми, хотя ни одно число на восемь не делится.
Вопрос 5
Почему без int(x) проверка x % 25 == 0 для чисел из файла не сработает?
ОтветСкрыть ответ
Ответ
Строка файла — текст, например "125\n". Делить текст с остатком нельзя: Python остановится с ошибкой. Сначала строку переводят в число.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Длина и края списка

В файле 17-1.txt содержится последовательность целых чисел, по одному в строке. Определите количество чисел в файле, затем сумму первого и последнего чисел.

17-1.txtПоследовательность целых чисел от −10 000 до 10 000Текстовый файл · 4,3 КБ

Введите через пробел количество чисел, затем сумму первого и последнего.

Делится на 4, но не на 8

Для файла 17-1.txt определите количество чисел, которые делятся на 4, но не делятся на 8, затем количество чисел от −100 до 100 включительно. В ответе запишите два числа.

17-1.txtПоследовательность целых чисел от −10 000 до 10 000Текстовый файл · 4,3 КБ

Введите через пробел количество чисел, кратных 4, но не 8, затем количество чисел от −100 до 100.

Кратные девяти и положительные

В файле 17-1.txt содержится последовательность целых чисел, каждое от −10 000 до 10 000 включительно. Определите количество чисел, кратных 9, затем количество положительных чисел, кратных 9. В ответе запишите два числа.

17-1.txtПоследовательность целых чисел от −10 000 до 10 000Текстовый файл · 4,3 КБ

Введите через пробел количество кратных 9, затем количество положительных кратных 9.

Сумма квадратов и квадрат суммы

Для чисел 2 и 7 найди сумму квадратов и квадрат суммы.

Введите через пробел сумму квадратов, затем квадрат суммы.