Автор: Сергей Погодин
Содержание задания
У 17-го задания повышенный уровень сложности. С его помощью проверяют, насколько ученик умеет обрабатывать последовательность чисел из файла. В задании требуется считать данные из файла и выбрать пары либо тройки идущих подряд чисел, удовлетворяющих некоторым условиям.
Покажем, как справиться с такой задачей, написав код на языке Python.
Список
В Python для хранения упорядоченных наборов данных используются списки. Список — это изменяемая коллекция элементов, доступным по индексу.
Пример объявления списка
a = []
# Список с начальными значениями
a = [25, 7, 8, 13, 52]
Доступ к элементам по индексу
# Прямая индексация (с начала)
print(a[0]) # 25 — первый элемент
print(a[2]) # 8 — третий элемент
# Отрицательная индексация (с конца)
print(a[-1]) # 52 — последний элемент
print(a[-2]) # 13 — предпоследний элемент
Изменение элементов
a[1] = 100 # Заменяем второй элемент
print(a) # [25, 100, 8, 13, 52]
Добавление элемента в конец списка
a = [25, 100, 8, 13, 52]
# Добавление в конец
a.append(13) # [25, 100, 8, 13, 52, 13]
Функции для работы со списками
a = [25, 7, 8, 13, 52, 87, 89, 36, 97, 56]
len()возвращает количество элементов в списке
n = len(a) # 10
sum()возвращает сумму всех элементов
total = sum(a) # 470
max()/min()возвращает максимальный и минимальный элемент из списка соответственно
max_value = max(a) # 97
min_value = min(a) # 7
Проверка наличия элемента в списке
# Проверка наличия элемента
has_52 = 52 in a # True
has_100 = 100 in a # False
Считывание данных из файла
В задании № 17 к условию приложен файл, в котором записаны числа, каждое в новой строке.

Функцией open() открываем файл
f = open('17.txt')
В качестве аргумента функции указываем название файла. Чтобы файл открылся без ошибок, он должен быть в одной папке с файлом программы. Если он находится в другом месте, нужно указывать полный путь, например f = open('с:\17.txt').

Если вы используете среду разработки PyCharm, можете скопировать ваш файл, правой кнопкой мыши нажать на выделенную область, затем применить команду Paste («Вставить») или использовать сочетание клавиш CTRL + V.

Также можно оставить файл с данными в любой папке, но тогда нужно будет прописать полный путь до него.
f = open('C:/Users/Yandex/files/17.txt')
Считывание данных
Будем перебирать циклом все строки из файла, переводить их функцией int() в целые числа и добавлять в массив.
a = []
for x in f:
a.append(int(x))
Вариант с генератором списков:
a = [ int(x) for x in f ]
Задача 1: база для всех заданий
В файле содержится последовательность из 10 000 целых положительных чисел. Каждое число не превышает 10 000. Определите и запишите в ответе сначала количество пар элементов последовательности, у которых сумма элементов кратна 120, затем максимальную из сумм элементов таких пар. В задаче под парой подразумеваются два элемента последовательности, идущих подряд. Порядок элементов в паре не важен.
Этапы решения задачи:
- Считаем данные из файла в массив и найдём его длину
- По условию пара — это два идущих подряд элемента последовательности. Мы будем перебирать массив с помощью цикла по индексам его элементов. Значит, в момент, когда индекс i указывает на какую-либо ячейку, число, идущее с ним в паре, имеет индекс на 1 больше. Для последнего элемента списка пары не будет, поэтому индекс i не должен указывать на него

- Будем подбирать подходящие нам пары и добавлять в список b суммы элементов таких пар:
- «сумма элементов кратна 120»
if (a[i] + a[i+1]) % 120 == 0:
- Из списка b выведем количество таких пар (количество сумм) и максимальную из сумм
Решение задачи
# Открываем файл и считываем числа в массив а
f = open('17.txt')
a = [int(x) for x in f]
n = len(a)
# Количество сумм пар - количество пар, поэтому
# в список b добавляем суммы подходящих пар
b = []
# Цикл до предпоследнего элемента
for i in range(n-1):
if (a[i] + a[i+1]) % 120 == 0 :
b.append(a[i] + a[i+1])
# Выводим ответы
print(len(b), max(b))
Задача 2: тройки чисел

Считываем данные
# Открываем файл и считываем числа в массив а
f = open('17_1.txt')
a = [int(x) for x in f]
n = len(a)
Перед тем как искать тройки чисел, найдём наименьшее число, кратное 2025.
min_2025 = 100_000
for i in a:
if i%2025==0:
min_2025 = min(min_2025,i)
Также можно найти минимальный элемент в созданном генератором списке — там будут все числа из исходного массива, делящиеся на 2025.
min_2025 = min([x for x in a if x%2025==0])
Синтаксис
[выражение for элемент in последовательность if условие]
Теперь перейдём к поиску троек. Решение не отличается: смотрим на элемент массива и ещё на два, идущих за ним.
b=[]
# Вычитаем из длины 2, потому что смотрим вперёд на 2 элемента
for i in range(n-2):
if (a[i]%min_2025==0 or a[i+1]%min_2025==0 or a[i+2]%min_2025==0) and 100000<=(a[i]+a[i+1]+a[i+2])<=999999:
b.append(a[i]+a[i+1]+a[i+2])
# Выводим количество троек и максимальную сумму
print(len(b),max(b))
Условие может получиться громоздким, поэтому в некоторых случаях удобно использовать проверку в функции.
Изменим код из последней задачи. Проверку на делимость вынесем в функцию F.
def F(x):
return x%min_2025==0
Тогда условие внутри цикла будет выглядеть следующим образом:
F(a[i]) or F(a[i+1]) or F(a[i+2])
Рассмотрим этот способ задания условия в следующей задаче.
Задача 3: сложные тройки

Этапы решения задачи:
- Считаем данные из файла в массив и найдём его длину
- Напишем функцию, которая проверяет, что число четырёхзначное
def g(x):
return 1000 <= abs(x) <= 9999
(проверяем по модулю, т. к. в файле присутствуют отрицательные числа)
- Найдём kmax — максимальный элемент последовательности, оканчивающийся на 25
kmax = max([x for x in a if abs(x) % 100 == 25])
- Найдём количество нужных пар и максимальную из сумм элементов необходимой пары:
- «не более двух из трёх элементов — четырёхзначные числа»
if g(a[i]) + g(a[i+1]) + g(a[i+2]) <= 2:
- «сумма элементов тройки не больше максимального элемента последовательности, оканчивающегося на 25»
(a[i] + a[i+1] + a[i+2]) <= kmax
# Считываем данные из файла в список а
f = open('17.txt')
a = [int(x) for x in f]
n = len(a)
# Функция проверки четырёхзначности числа
def g(x):
return 1000<=abs(x)<=9999
# Найдём максимальный элемент последовательности, оканчивающийся на 25
kmax = max(x for x in a if abs(x)%100==25)
# Решение задачи
b=[]
for i in range(n-2):
if (g(a[i])+g(a[i+1])+g(a[i+2]))<=2:
if (a[i]+a[i+1]+a[i+2]) <=kmax:
b.append(a[i]+a[i+1]+a[i+2])
print(len(b),max(b))
# 6315 84523
Частые примеры условий в задании

Вывод
Выделим ключевые моменты в решении:
- Для работы с файлом данных нужно убедиться, что он находится в той же папке, что и программа, в противном случае в коде следует указать его полный путь. Чтобы открыть файл, используем функцию
open() - Применяем генератор списков для быстрого и компактного преобразования данных
- Не забываем про индексацию при работе с парами (n − 1) и тройками (n − 2)
- Выносим сложные условия в отдельные функции, чтобы повысить читаемость кода
- Используем модуль
abs()при проверке свойств чисел, так как в файлах могут встречаться отрицательные значения
Потренироваться и закрепить свои знания можно в подборке заданий.