Решение задания № 17 на языке Python

Автор: Сергей Погодин

Содержание задания

У 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 к условию приложен файл, в котором записаны числа, каждое в новой строке.

img

Функцией open() открываем файл

f = open('17.txt')

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

img

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

img

Также можно оставить файл с данными в любой папке, но тогда нужно будет прописать полный путь до него.

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, затем максимальную из сумм элементов таких пар. В задаче под парой подразумеваются два элемента последовательности, идущих подряд. Порядок элементов в паре не важен.

Этапы решения задачи:

  1. Считаем данные из файла в массив и найдём его длину
  2. По условию пара — это два идущих подряд элемента последовательности. Мы будем перебирать массив с помощью цикла по индексам его элементов. Значит, в момент, когда индекс i указывает на какую-либо ячейку, число, идущее с ним в паре, имеет индекс на 1 больше. Для последнего элемента списка пары не будет, поэтому индекс i не должен указывать на него

img

  1. Будем подбирать подходящие нам пары и добавлять в список b суммы элементов таких пар:
  • «сумма элементов кратна 120»
if   (a[i] + a[i+1]) % 120 == 0:
  1. Из списка 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: тройки чисел

Ссылка

img

Считываем данные

# Открываем файл и считываем числа в массив а
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: сложные тройки

Ссылка

img

Этапы решения задачи:

  1. Считаем данные из файла в массив и найдём его длину
  2. Напишем функцию, которая проверяет, что число четырёхзначное
def g(x):
    return 1000 <= abs(x) <= 9999

(проверяем по модулю, т. к. в файле присутствуют отрицательные числа)

  1. Найдём kmax — максимальный элемент последовательности, оканчивающийся на 25

kmax = max([x for x in a if abs(x) % 100 == 25])

  1. Найдём количество нужных пар и максимальную из сумм элементов необходимой пары:
  • «не более двух из трёх элементов — четырёхзначные числа»

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

Частые примеры условий в задании

img

Вывод

Выделим ключевые моменты в решении:

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

Потренироваться и закрепить свои знания можно в подборке заданий.

Источник: Яндекс Учебник — Решение задания № 17 на языке Python. Каталог разборов: education.yandex.ru.

Назад к статьям Поделиться