Найти в Дзене

Алгоритм решения задания 17 ЕГЭ по информатике

В прошлой статье мы познакомились с программными методами, которые будем использовать для решения 17 заданий ЕГЭ по информатике. Теперь же давайте познакомимся с базовыми формулировками этих заданий и научимся их решать. Основная сложность данного задания кроется в его витиеватой и запутанной формулировке. Ваша задача — вдумчиво прочитать текст и выписать все необходимые условия, которым должны соответствовать искомые числа. В ответе всегда требуется указать два числа: количество подходящих пар или троек чисел и результат какого-либо выражения с ними (максимальная сумма элементов, минимальная сумма квадратов, произведение элементов и т.д.). Строгой типологии в этом задании нет: все формулировки одновременно и похожи между собой, и отличаются в деталях. В этой статье мы разберём несколько различающихся формулировок и продемонстрируем большую часть базовых подходов к решению. По большому счёту, для успешного решения 17 заданий вам потребуются базовые алгоритмы в программировании: С треть
Оглавление

О задании

В прошлой статье мы познакомились с программными методами, которые будем использовать для решения 17 заданий ЕГЭ по информатике. Теперь же давайте познакомимся с базовыми формулировками этих заданий и научимся их решать.

Основная сложность данного задания кроется в его витиеватой и запутанной формулировке. Ваша задача — вдумчиво прочитать текст и выписать все необходимые условия, которым должны соответствовать искомые числа. В ответе всегда требуется указать два числа: количество подходящих пар или троек чисел и результат какого-либо выражения с ними (максимальная сумма элементов, минимальная сумма квадратов, произведение элементов и т.д.).

Строгой типологии в этом задании нет: все формулировки одновременно и похожи между собой, и отличаются в деталях. В этой статье мы разберём несколько различающихся формулировок и продемонстрируем большую часть базовых подходов к решению.

Алгоритм решения

По большому счёту, для успешного решения 17 заданий вам потребуются базовые алгоритмы в программировании:

  1. Найти одну или несколько последних цифр числа
  2. Проверить количество разрядов в числе (двузначное, трёхзначное и т.д.)
  3. Применить базовые функции min(), max(), sum(), len(), abs()
  4. Провести какие-либо математические операции (сравнение, возведение в степень и т.д.)

С третьим пунктом мы разобрались еще в прошлой статье. Базовые математические операции не должны вызвать затруднений. А вот первым двум пунктам уделим внимание перед началом решения заданий.

Поиск последней цифры числа

Сначала вспомним, как найти последнюю цифру числа (разряд). Для этого есть два подхода:

  1. Взять остаток от деления на 10
  2. Перевести число в строку и взять последний символ по индексу -1

Продемонстрируем оба:

-2

Соответственно две последние цифры можно получить как остаток от деления на 100 или срезом [-2:]:

-3

Выбирайте метод исходя из последующих операций. Например, если в условии сказано, что две последние цифры нужно сравнить с каким-то числом, логично будет остаться в целочисленном типе данных и использовать остаток от деления.

Определение количества разрядов

Здесь всё так же есть два способа:

  1. Через двойное неравенство
  2. Через перевод в строку и функцию len()

Как и в предыдущем примере: либо остаёмся в целочисленном типе, либо переводим значение в строку. Например, определим, что наше число num — четырёхзначное.

Четырёхзначное число должно быть строго больше 999 и меньше 10 000. Возможны и другие варианты записи двойного неравенства — выбирайте наиболее удобный. Мы запишем так:

-4

Во втором способе сначала переведём num в строковый тип данных, а затем проверим, что количество символов в строке равно четырём:

-5

Основные алгоритмы рассмотрели — переходим к решению заданий. Начнём с такой формулировки:

Задание 1712

«В файле содержится последовательность целых чисел.

Её элементы могут принимать целые значения от –10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа оканчиваются на нечётные цифры, различные для элементов в паре, затем минимальное из произведений модулей элементов таких пар.

В данной задаче под парой подразумевается два идущих подряд элемента последовательности.»

Давайте для начала выделим ключевые моменты:

  1. Работаем с парами идущих подряд элементов
  2. Числа могут быть как положительными, так и отрицательными (от –10 000 до 10 000)
  3. Ищем последние цифры каждого числа в паре
  4. Эти цифры должны быть нечётными и различными
  5. В ответе указываем: количество подходящих пар и минимальное произведение модулей этих чисел

Такое структурированное выделение ключевых моментов помогает лучше понять условие и не запутаться в формулировках. Старайтесь для каждого задания тезисно выписывать части условия и подчёркивать ключевые слова!

Начнём решение с чтения данных из файла и сохранения их в виде списка data:

-6

Создадим список, в который будем собирать произведения модулей чисел всех подходящих пар:

-7

Напишем цикл для перебора пар идущих подряд элементов:

-8

Внутри цикла найдём последнюю цифру каждого числа:

-9

Проверим, что обе цифры нечётные (остаток от деления на 2 не равен нулю) и различные:

-10

Как только условие выполняется, добавляем в список ans произведение модулей чисел x и y. Модуль числа получаем функцией abs():

-11

Остаётся только вывести на экран количество элементов в ans и минимальный элемент этого списка:

-12

Запускаем программу и видим на экране два числа — 864 4683 — которые и будут ответом на это задание.

Пример 1

Следующим у нас на очереди будет задание с такой формулировкой:

Задание 1715

«В файле содержится последовательность целых чисел.

Её элементы могут принимать целые значения от -100 000 до 100 000 включительно. Определите количество пар последовательности, в которых только один из элементов является пятизначным числом, a квадрат суммы элементов пары превышает квадрат максимального пятизначного элемента последовательности, оканчивающегося на 37. В ответе запишите количество найденных пар, затем максимальную из сумм элементов таких пар.

В данной задаче под парой подразумевается два идущих подряд элемента последовательности.»

Снова выделим ключевые моменты:

  1. Работаем с парами идущих подряд элементов
  2. Числа могут быть как положительными, так и отрицательными (от –100 000 до 100 000)
  3. Нужно найти максимальное пятизначное число последовательности, оканчивающееся на 37
  4. Только один из элементов пары должен быть пятизначным числом
  5. Подходят пары, у которых квадрат суммы чисел больше квадрата числа из пункта 3
  6. В ответе указываем: количество подходящих пар и максимальную сумму чисел пары

Здесь предстоит выполнить значительно больше действий. Давайте сначала разберёмся с пунктами 3 и 4, а затем перейдём к коду решения.

Реализацию обеих проверок для числа из пункта 3 мы уже освоили в начале статьи. Пятизначное число должно быть строго больше 9999 и меньше 100 000. Не забываем, что в задании есть и отрицательные числа:

-13

А проверить, что число i оканчивается на 37 можно так:

-14

Чтобы найти максимальное число из списка data, которое одновременно пятизначное и оканчивается на 37, используем такую запись:

-15

Для проверки условия из пункта 4 лучше создать функцию. С проверкой числа на «пятизначность» мы уже знакомы, но как добиться того, чтобы в паре было только одно пятизначное число?

Можно воспользоваться логической операцией «исключающее ИЛИ» (строгая дизъюнкция). Она возвращает истину, только если один из операндов истинный, а другой — ложный.

-16

В программировании исключающее ИЛИ обозначается знаком ^. Напишем функцию, которая принимает два числа и возвращает результат операции исключающего ИЛИ для проверок обоих чисел на «пятизначность»:

-17

Больше сложностей не предвидится — собираем программу. Сначала считываем данные из файла:

-18

Добавляем код с проверками третьего и четвёртого пунктов:

-19

Создаём пустой список ans и перебираем пары в цикле:

-20

Теперь идёт проверка: функция f() должна возвращать истину, а квадрат суммы чисел x и y должен быть больше квадрата числа в переменной max_37:

-21

Добавляем сумму чисел подходящей пары и выводим на экран количество элементов в списке ans и максимальный элемент:

-22

Запускаем программу и получаем два числа: 350 и 107294. Это и есть ответ на задание.

Пример 2

Напоследок рассмотрим задание с такой формулировкой:

Задание 1718

«В файле содержится последовательность целых чисел.

Её элементы могут принимать целые значения от -100 000 до 100 000 включительно. Определите количество троек элементов последовательности, в которых ни один из трёх элементов не является четырёхзначным числом, а сумма элементов тройки больше максимального элемента последовательности, оканчивающегося на 30. В ответе запишите количество найденных троек чисел, затем максимальную из сумм элементов таких троек.

В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.»

Как обычно, начинаем с ключевых моментов:

  1. Работаем с тройками идущих подряд элементов
  2. Числа могут быть как положительными, так и отрицательными (от –100 000 до 100 000)
  3. Нужно найти максимальное число последовательности, оканчивающееся на 30
  4. Ни один из элементов тройки не должен быть четырёхзначным
  5. Подходят тройки, у которых сумма чисел больше числа из пункта 3
  6. В ответе указываем: количество подходящих троек и максимальную сумму чисел тройки

Считываем данные из файла в список data:

-23

Находим число из пункта 3. Среди чисел, оканчивающихся на 30, ищем максимальное:

-24

Для четвёртого пункта напишем отдельную функцию — так условие в цикле будет выглядеть лаконичнее. В функции потребуем, чтобы ни одно число не находилось в диапазоне от 999 до 10 000. Используем функцию any() с отрицанием (оператор not):

-25

Такая запись проверяет, что ни для одного числа из списка nums неравенство 999 < abs(n) < 10000 не возвращает истину.

Кстати, в этот раз мы не будем записывать каждое число в отдельную переменную, а сохраним всю тройку в один кортеж. В цикле этот кортеж назовём elements:

-26

В условии проверяем истинность функции not_is_4, в которую передаём кортеж из тройки чисел, а также проверяем, что сумма чисел тройки больше числа в max_30:

-27

Добавляем суммы удовлетворяющих условию троек в список ans:

-28

Выводим результат на экран:

-29

Запускаем программу и получаем ответ на данное задание — пару чисел 1032 и 285423.

Больше заданий данного типа с подробным решением вы можете найти в нашем тренажёре