
Обработка числовой последовательности в файле
Штана Альберт Игоревич
В этой статье будет разобрано задание 17.
Рассмотрим типовые задачи из семнадцатого задания ЕГЭ по информатике.
Данное задание относится к повышенному уровню сложности.
Время выполнения задания ≈ 14 минут.
Данное задание проверяет умение составить алгоритм обработки числовой последовательности. Решение программируется на Python.
В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10000 до 10000 включительно.
Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа делятся нацело на 7, затем минимальную из сумм элементов таких пар.
В данной задаче под парой подразумевается два подряд идущих элемента последовательности. Например, для последовательности из пяти элементов: 7; 14; 21; -7; 4 - ответ 3 14.
Создадим программу на Python.
f = open('17_1.txt')
c = 0
mn = 10 ** 10
n1 = int(f.readline())
for s in f.readlines():
n2 = int(s)
if abs(n1) % 7 == 0 and abs(n2) % 7 == 0:
c += 1
mn = min(mn, n1 + n2)
n1 = n2
print(c, mn)
В начале открываем файл на чтение с помощью команды open(). Файл и код программы должны находится в одной папке, чтобы не прописывать полный путь. Переменная c(счётчик) отвечает за количество пар, удовлетворяющих условию задачи. Переменная mn - это минимальная сумма элементов подходящих пар. В переменную mn кладём очень большое число, т.к. будем искать минимум. Затем считываем в переменную n1 первое число из файла. C помощью конструкции "for s in f.readlines():" можно перебрать остальные строки из файла. В цикле записываем второе число для пары в переменную n2. Важно применить функцию int() к переменной цикла, чтобы преобразовать строку в число. После того как у нас появилась первая пара (n1 и n2), проверяем её под условие задачи. Если одновременно два числа из пары делятся на 7 без остатка, то подсчитываем такую пару. Т.к. в файле есть отрицательные числами — применяем функцию модуль числа abs(). Пример: abs(-13)%10=3. Если пара подходит, то проверяем сумму элементов этой пары на минимальность. В переменную mn заносится минимальное значение из двух вариантов: значение mn или n1+n2. В конце цикла нужно сохранить второе число(n2) в переменную n1. Тем самым мы получим новую пару чисел в последующей итерации цикла.
Ответ: 97 | -15820
В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -100 000 до 100 000 включительно.
Определите количество троек элементов последовательности, в которых хотя бы одно из чисел является четырёхзначным, а сумма элементов тройки больше максимального элемента последовательности, оканчивающегося на 80.
В ответе запишите количество найденных троек чисел, затем минимальную из сумм элементов таких троек.
В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.
Создадим программу на Python.
f = open('17_2.txt')
data = [int(s) for s in f.readlines()]
data_f = filter(lambda x: abs(x) % 100 == 80, data)
maxi = max(data_f)
n1 = data[0]
n2 = data[1]
mn = []
k = 0
for n3 in data[2:]:
if (1000 <= abs(n1) <= 9999) or (1000 <= abs(n2) <= 9999) or (1000 <= abs(n3) <= 9999):
if n1 + n2 + n3 > maxi:
k += 1
mn.append(n1 + n2 + n3)
n1 = n2
n2 = n3
print(k, min(mn))
Разберём код построчно:
Ответ: 1002 | 14898
В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -100 000 до 100 000 включительно.
Определите количество пар последовательности, в которых оба числа оканчиваются на одну и ту же нечётную цифру, и при этом хотя бы один элемент пары больше среднего арифметического элементов последовательности.
В ответе запишите количество найденных пар, а затем максимальный из модулей разности элементов таких пар.
В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
Создадим программу на Python.
f = open('17_3.txt')
data = [int(s) for s in f.readlines()]
sa = sum(data) / len(data)
k = 0
mx = []
n1 = data[0]
for n2 in data[1:]:
l1 = abs(n1) % 10
l2 = abs(n2) % 10
if l1 % 2 == 1 and l2 % 2 == 1 and l1 == l2 and (n1 > sa or n2 > sa):
k += 1
mx.append(abs(n2 - n1))
n1 = n2
print(k, max(mx))
Разберём код построчно:
Ответ: 270 | 198724
В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10000 до 10000 включительно.
Определите и запишите в ответе сначала количество пар элементов последовательности, в которых хотя бы одно число является полным квадратом некоторого натурального числа, затем максимальную из сумм элементов таких пар.
В данной задаче под парой подразумевается два подряд идущих элемента последовательности. Например, для последовательности из пяти элементов: 9; 15; 23; -3; 4 - ответ 2 24.
Напишем программу на Python.
f = open('17_4.txt')
data = [int(s) for s in f.readlines()]
k = 0
mx = []
n1 = data[0]
for n2 in data[1:]:
if (0 < n1 == (round(n1 ** 0.5) ** 2)) or (0 < n2 == (round(n2 ** 0.5) ** 2)):
k += 1
mx.append(n1 + n2)
n1 = n2
print(k, max(mx))
Данная задача отличается от предыдущих тем что мы в цикле должны правильно определить условие проверки пары чисел на полный квадрат.В условии извлекаем корень через возведение числа в степень 0.5, затем округляем и возводим в квадрат. Если получилось то же число значит оно является полным квадратом.
Ответ: 60 | 18555
В файле содержится последовательность натуральных чисел. Элементы последовательности могут принимать целые значения от 1 до 100 000 включительно.
Определите количество пар последовательности, в которых хотя бы один элемент больше максимального простого числа в файле.
В ответе запишите количество найденных пар, затем минимальную из сумм элементов таких пар.
В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
Напишем программу на Python.
def nm_f(n):
if n == 1:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
f = open('17_5.txt')
data = [int(s) for s in f.readlines()]
mx = -10 ** 10
for x in data:
if nm_f(x):
mx = max(mx, x)
k = 0
mn = 10 ** 10
n1 = data[0]
for n2 in data[1:]:
if n1 > mx or n2 > mx:
k += 1
mn = min(mn, n1 + n2)
n1 = n2
print(k, mn)
В этой задаче ещё определили функцию для проверки числа на простоту. Простое число — это число, которое имеет ровно два различных делителя: 1 и само число.После определения функции для проверки числа на простоту пишем код аналогичный кодам из задач выше.
Ответ: 22 | 105792
В файле содержится последовательность натуральных чисел. Элементы последовательности могут принимать целые значения от 1 до 100 000 включительно.
Определите количество пар последовательности, в которых оба элемента больше минимального числа во всей последовательности, которое в семеричной системе оканчивается на 3.
В ответе запишите количество найденных пар, затем максимальную сумму квадратов элементов таких пар.
В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
Напишем программу на Python.
f = open('17_6.txt')
data = [int(s) for s in f.readlines()]
mn = 10 ** 10
for x in data:
if x % 7 == 3:
mn = min(mn, x)
k = 0
mx = -10 ** 10
n1 = data[0]
for n2 in data[1:]:
if n1 > 87 and n2 > 87:
k += 1
mx = max(mx, n1 ** 2 + n2 ** 2)
n1 = n2
print(k, mx)
Сначала находим минимальное число во всей последовательности чисел, которое в семеричной системе оканчивается на 3. Остаток при делении на 7 — это и есть последняя цифра в семеричной системе в разряде единиц. Далее пишем аналогичный код как в прошлых задачах.
Ответ: 4993 | 19774187428
В файле содержится последовательность натуральных чисел. Элементы последовательности могут принимать целые значения от 1 до 100 000 включительно.
Определите количество пар последовательности, в которых оба элемента больше максимального числа во всей последовательности, которое начинается на цифру "1".
В ответе запишите количество найденных пар, затем минимальную сумму элементов таких пар.
В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
Напишем программу на Python.
f = open('17_7.txt')
data = [int(s) for s in f.readlines()]
mx = -10 ** 10
for x in data:
if str(x)[0] == '1':
mx = max(mx, x)
k = 0
mn = 10 ** 10
n1 = data[0]
for n2 in data[1:]:
if n1 > mx and n2 > mx:
k += 1
mn = min(mn, n1 + n2)
n1 = n2
print(k, mn)
Сначала найдём максимальное число во всей последовательности, которое начинается на цифру 1. С помощью функции str() преобразовываем число x в строку и анализируем первый символ этой строки. Далее пишем аналогичный код как в предыдущих задачах.
Ответ: 3198 | 43629
В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от -10 000 до 10 000 включительно.
Определите и запишите в ответе сначала количество троек элементов последовательности, в которых числа расположены в порядке возрастания, затем минимальную из разностей наибольшего и наименьшего элементов таких троек.
В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.
Напишем программу на Python.
f = open('17_8.txt')
data = [int(s) for s in f.readlines()]
k = 0
mn = 10 ** 10
n1 = data[0]
n2 = data[1]
for n3 in data[2:]:
if n1 < n2 < n3:
k += 1
maxi = max(n1, n2, n3)
mini = min(n1, n2, n3)
mn = min(mn, maxi - mini)
n1 = n2
n2 = n3
print(k, mn)
Здесь проверяем не пару чисел, а тройку. И между минимумом и максимумом из трёх чисел вычисляем минимум от разницы максимума и минимума.
Ответ: 832 | 460
В файле содержится последовательность из 10 000 целых положительных чисел. Каждое число не превышает 10 000.
Определите и запишите в ответе сначала количество пар элементов последовательности, у которых сумма элементов кратна 9, затем максимальную из сумм элементов таких пар.
В данной задаче под парой подразумевается два различных элемента последовательности. Порядок элементов в паре не важен.
Напишем программу на Python.
f = open('17_9.txt')
data = [int(s) for s in f.readlines()]
k = 0
mx = 0
for i in range(0, len(data)):
for j in range(i + 1, len(data)):
if (data[i] + data[j]) % 9 == 0:
k += 1
mx = max(data[i] + data[j], mx)
print(k, mx)
То что мы ранее делали с помощью одного цикла и двух переменных n1, n2 — теперь мы сделали это с помощью двух циклов. Циклы настраиваются таким образом, что мы берём число и начинаем его комбинировать во втором цикле со всеми числами, которые стоят после этого числа. Таким образом, организован перебор всех возможных комбинации без повторения пар.
Ответ: 5553635 | 19998
Вывод: во всех подобных задачах можно реализовать решение разными способами, но главное правильно писать условные конструкции по которым проверяются числа.
В файле содержится последовательность натуральных чисел, каждое из которых не превышает 100 000.
Определите количество троек элементов последовательности, в которых ровно два из трёх элементов являются трёхзначными числами, а сумма элементов тройки не больше максимального элемента последовательности, оканчивающегося на 13.
Гарантируется, что в последовательности есть хотя бы одно число, оканчивающееся на 13.
В ответе запишите количество найденных троек чисел, затем максимальную из сумм элементов таких троек.
В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.
Напишем программу на Python с комментариями в коде.
file17 = open('17_2024.txt') # Открываем файл задачи на чтение
data_list = [int(i) for i in file17.readlines()] # Прочитаем данные из файла в список целых чисел
# Определим максимальный элемент который оканчивается на 13
max_el = max(data_list, key=lambda x: x if x % 100 == 13 else 0)
max_summ = 0 # Максимальная из сумм элементов троек
k = 0 # Количество найденных троек чисел
n1 = data_list[0] # Первый элемент
n2 = data_list[1] # Второй элемент
for x in data_list[2:]: # Перебираем последовательность
n3 = x # Третий элемент
c = 0 # Переменная счётчик трёхзначности трёх идущих подряд элементов
if 100 <= n1 <= 999: # Наглядно проверяем все три элемента на трёхзначность
c += 1
if 100 <= n2 <= 999:
c += 1
if 100 <= n3 <= 999:
c += 1
# По условию если 2 элемента трёхзначные и сумма меньше максимального элемента оканчивающегося на 13
if c == 2 and n1 + n2 + n3 <= max_el:
k += 1 # Увеличиваем счётчик на 1 как количество элементов удовлетворяющих условию задачи
max_summ = max(max_summ, n1 + n2 + n3) # Вычисляем максимальную сумму трёх элементов удовлетворивших условие
n1 = n2 # Записываем второй элемент в первый элемент
n2 = n3 # Записываем третий элемент во второй элемент
print(k, max_summ) # Выводим ответ
Ответ: 959 | 97471
В файле содержится последовательность натуральных чисел. Её элементы могут принимать целые значения от 1 до 100 000 включительно.
Определите количество пар последовательности, в которых остаток от деления хотя бы одного из элементов на 16 равен минимальному элементу последовательности.
В ответе запишите количество найденных пар, затем максимальную из сумм элементов таких пар.
В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
Напишем программу на Python с комментариями в коде.
file17 = open('17_2025.txt') # Открываем файл задачи на чтение
data_list = [int(i) for i in file17.readlines()] # Прочитаем данные из файла в список целых чисел
# Определим минимальный элемент последовательности
min_el = min(data_list)
max_summ = 0 # Максимальная из сумм элементов пар чисел
k = 0 # Количество найденных пар чисел
n1 = data_list[0] # Первый элемент
for x in data_list[1:]: # Перебираем последовательность
n2 = x # Второй элемент
# По условию остаток от деления хотя бы одного из элементов на 16 равен минимальному элементу последовательности
if n1 % 16 == min_el or n2 % 16 == min_el:
k += 1 # Увеличиваем счётчик на 1 как количество элементов удовлетворяющих условию задачи
max_summ = max(max_summ, n1 + n2) # Вычисляем максимальную сумму пар элементов удовлетворивших условию
n1 = n2 # Записываем второй элемент в первый элемент и продолжаем цикл
print(k, max_summ) # Выводим ответ
Ответ: 1214 | 176024
В файле содержится последовательность натуральных чисел. Её элементы могут принимать целые значения от 1 до 100 000 включительно.
Определите количество пар последовательности, в которых только один из элементов является двузначным числом, а сумма элементов пары кратна минимальному двузначному элементу последовательности.
В ответе запишите количество найденных пар, затем максимальную из сумм элементов таких пар.
В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
Напишем программу на Python с комментариями в коде.
file17 = open('17_2026.txt') # Открываем файл задачи на чтение
data_list = [int(i) for i in file17.readlines()] # Прочитаем данные из файла в список целых чисел
# Определим минимальный двузначный элемент последовательности
min_el = min([x for x in data_list if x > 9])
max_summ = 0 # Максимальная из сумм элементов пар чисел
k = 0 # Количество найденных пар чисел
n1 = data_list[0] # Первый элемент
for x in data_list[1:]: # Перебираем последовательность
n2 = x # Второй элемент
# По условию только один из элементов является двузначным числом,
# а сумма элементов пары кратна минимальному двузначному элементу
if ((len(str(n1)) == 2 and len(str(n2)) != 2) or (len(str(n2)) == 2 and len(str(n1)) != 2)) and ((n1 + n2) % min_el == 0):
k += 1 # Увеличиваем счётчик на 1 как количество элементов удовлетворяющих условию задачи
max_summ = max(max_summ, n1 + n2) # Вычисляем максимальную сумму пар элементов удовлетворивших условию
n1 = n2 # Записываем второй элемент в первый элемент и продолжаем цикл
print(k, max_summ) # Выводим ответ
Ответ: 150 | 9930