О задании
В прошлой статье мы познакомились с программными методами, которые будем использовать для решения 17 заданий ЕГЭ по информатике. Теперь же давайте познакомимся с базовыми формулировками этих заданий и научимся их решать.
Основная сложность данного задания кроется в его витиеватой и запутанной формулировке. Ваша задача — вдумчиво прочитать текст и выписать все необходимые условия, которым должны соответствовать искомые числа. В ответе всегда требуется указать два числа: количество подходящих пар или троек чисел и результат какого-либо выражения с ними (максимальная сумма элементов, минимальная сумма квадратов, произведение элементов и т.д.).
Строгой типологии в этом задании нет: все формулировки одновременно и похожи между собой, и отличаются в деталях. В этой статье мы разберём несколько различающихся формулировок и продемонстрируем большую часть базовых подходов к решению.
Алгоритм решения
По большому счёту, для успешного решения 17 заданий вам потребуются базовые алгоритмы в программировании:
- Найти одну или несколько последних цифр числа
- Проверить количество разрядов в числе (двузначное, трёхзначное и т.д.)
- Применить базовые функции min(), max(), sum(), len(), abs()
- Провести какие-либо математические операции (сравнение, возведение в степень и т.д.)
С третьим пунктом мы разобрались еще в прошлой статье. Базовые математические операции не должны вызвать затруднений. А вот первым двум пунктам уделим внимание перед началом решения заданий.
Поиск последней цифры числа
Сначала вспомним, как найти последнюю цифру числа (разряд). Для этого есть два подхода:
- Взять остаток от деления на 10
- Перевести число в строку и взять последний символ по индексу -1
Продемонстрируем оба:
Соответственно две последние цифры можно получить как остаток от деления на 100 или срезом [-2:]:
Выбирайте метод исходя из последующих операций. Например, если в условии сказано, что две последние цифры нужно сравнить с каким-то числом, логично будет остаться в целочисленном типе данных и использовать остаток от деления.
Определение количества разрядов
Здесь всё так же есть два способа:
- Через двойное неравенство
- Через перевод в строку и функцию len()
Как и в предыдущем примере: либо остаёмся в целочисленном типе, либо переводим значение в строку. Например, определим, что наше число num — четырёхзначное.
Четырёхзначное число должно быть строго больше 999 и меньше 10 000. Возможны и другие варианты записи двойного неравенства — выбирайте наиболее удобный. Мы запишем так:
Во втором способе сначала переведём num в строковый тип данных, а затем проверим, что количество символов в строке равно четырём:
Основные алгоритмы рассмотрели — переходим к решению заданий. Начнём с такой формулировки:
«В файле содержится последовательность целых чисел.
Её элементы могут принимать целые значения от –10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа оканчиваются на нечётные цифры, различные для элементов в паре, затем минимальное из произведений модулей элементов таких пар.
В данной задаче под парой подразумевается два идущих подряд элемента последовательности.»
Давайте для начала выделим ключевые моменты:
- Работаем с парами идущих подряд элементов
- Числа могут быть как положительными, так и отрицательными (от –10 000 до 10 000)
- Ищем последние цифры каждого числа в паре
- Эти цифры должны быть нечётными и различными
- В ответе указываем: количество подходящих пар и минимальное произведение модулей этих чисел
Такое структурированное выделение ключевых моментов помогает лучше понять условие и не запутаться в формулировках. Старайтесь для каждого задания тезисно выписывать части условия и подчёркивать ключевые слова!
Начнём решение с чтения данных из файла и сохранения их в виде списка data:
Создадим список, в который будем собирать произведения модулей чисел всех подходящих пар:
Напишем цикл для перебора пар идущих подряд элементов:
Внутри цикла найдём последнюю цифру каждого числа:
Проверим, что обе цифры нечётные (остаток от деления на 2 не равен нулю) и различные:
Как только условие выполняется, добавляем в список ans произведение модулей чисел x и y. Модуль числа получаем функцией abs():
Остаётся только вывести на экран количество элементов в ans и минимальный элемент этого списка:
Запускаем программу и видим на экране два числа — 864 4683 — которые и будут ответом на это задание.
Пример 1
Следующим у нас на очереди будет задание с такой формулировкой:
«В файле содержится последовательность целых чисел.
Её элементы могут принимать целые значения от -100 000 до 100 000 включительно. Определите количество пар последовательности, в которых только один из элементов является пятизначным числом, a квадрат суммы элементов пары превышает квадрат максимального пятизначного элемента последовательности, оканчивающегося на 37. В ответе запишите количество найденных пар, затем максимальную из сумм элементов таких пар.
В данной задаче под парой подразумевается два идущих подряд элемента последовательности.»
Снова выделим ключевые моменты:
- Работаем с парами идущих подряд элементов
- Числа могут быть как положительными, так и отрицательными (от –100 000 до 100 000)
- Нужно найти максимальное пятизначное число последовательности, оканчивающееся на 37
- Только один из элементов пары должен быть пятизначным числом
- Подходят пары, у которых квадрат суммы чисел больше квадрата числа из пункта 3
- В ответе указываем: количество подходящих пар и максимальную сумму чисел пары
Здесь предстоит выполнить значительно больше действий. Давайте сначала разберёмся с пунктами 3 и 4, а затем перейдём к коду решения.
Реализацию обеих проверок для числа из пункта 3 мы уже освоили в начале статьи. Пятизначное число должно быть строго больше 9999 и меньше 100 000. Не забываем, что в задании есть и отрицательные числа:
А проверить, что число i оканчивается на 37 можно так:
Чтобы найти максимальное число из списка data, которое одновременно пятизначное и оканчивается на 37, используем такую запись:
Для проверки условия из пункта 4 лучше создать функцию. С проверкой числа на «пятизначность» мы уже знакомы, но как добиться того, чтобы в паре было только одно пятизначное число?
Можно воспользоваться логической операцией «исключающее ИЛИ» (строгая дизъюнкция). Она возвращает истину, только если один из операндов истинный, а другой — ложный.
В программировании исключающее ИЛИ обозначается знаком ^. Напишем функцию, которая принимает два числа и возвращает результат операции исключающего ИЛИ для проверок обоих чисел на «пятизначность»:
Больше сложностей не предвидится — собираем программу. Сначала считываем данные из файла:
Добавляем код с проверками третьего и четвёртого пунктов:
Создаём пустой список ans и перебираем пары в цикле:
Теперь идёт проверка: функция f() должна возвращать истину, а квадрат суммы чисел x и y должен быть больше квадрата числа в переменной max_37:
Добавляем сумму чисел подходящей пары и выводим на экран количество элементов в списке ans и максимальный элемент:
Запускаем программу и получаем два числа: 350 и 107294. Это и есть ответ на задание.
Пример 2
Напоследок рассмотрим задание с такой формулировкой:
«В файле содержится последовательность целых чисел.
Её элементы могут принимать целые значения от -100 000 до 100 000 включительно. Определите количество троек элементов последовательности, в которых ни один из трёх элементов не является четырёхзначным числом, а сумма элементов тройки больше максимального элемента последовательности, оканчивающегося на 30. В ответе запишите количество найденных троек чисел, затем максимальную из сумм элементов таких троек.
В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.»
Как обычно, начинаем с ключевых моментов:
- Работаем с тройками идущих подряд элементов
- Числа могут быть как положительными, так и отрицательными (от –100 000 до 100 000)
- Нужно найти максимальное число последовательности, оканчивающееся на 30
- Ни один из элементов тройки не должен быть четырёхзначным
- Подходят тройки, у которых сумма чисел больше числа из пункта 3
- В ответе указываем: количество подходящих троек и максимальную сумму чисел тройки
Считываем данные из файла в список data:
Находим число из пункта 3. Среди чисел, оканчивающихся на 30, ищем максимальное:
Для четвёртого пункта напишем отдельную функцию — так условие в цикле будет выглядеть лаконичнее. В функции потребуем, чтобы ни одно число не находилось в диапазоне от 999 до 10 000. Используем функцию any() с отрицанием (оператор not):
Такая запись проверяет, что ни для одного числа из списка nums неравенство 999 < abs(n) < 10000 не возвращает истину.
Кстати, в этот раз мы не будем записывать каждое число в отдельную переменную, а сохраним всю тройку в один кортеж. В цикле этот кортеж назовём elements:
В условии проверяем истинность функции not_is_4, в которую передаём кортеж из тройки чисел, а также проверяем, что сумма чисел тройки больше числа в max_30:
Добавляем суммы удовлетворяющих условию троек в список ans:
Выводим результат на экран:
Запускаем программу и получаем ответ на данное задание — пару чисел 1032 и 285423.
Больше заданий данного типа с подробным решением вы можете найти в нашем тренажёре