Алгоритм решения задания 17 ЕГЭ по информатике
О задании
В прошлой статье мы познакомились с программными методами, которые будем использовать для решения 17 заданий ЕГЭ по информатике. Теперь же давайте познакомимся с базовыми формулировками этих заданий и научимся их решать.
Основная сложность данного задания кроется в его витиеватой и запутанной формулировке. Ваша задача — вдумчиво прочитать текст и выписать все необходимые условия, которым должны соответствовать искомые числа. В ответе всегда требуется указать два числа: количество подходящих пар или троек чисел и результат какого-либо выражения с ними (максимальная сумма элементов, минимальная сумма квадратов, произведение элементов и т.д.).
Строгой типологии в этом задании нет: все формулировки одновременно и похожи между собой, и отличаются в деталях. В этой статье мы разберём несколько различающихся формулировок и продемонстрируем большую часть базовых подходов к решению.
Алгоритм решения
По большому счёту, для успешного решения 17 заданий вам потребуются базовые алгоритмы в программировании:
- Найти одну или несколько последних цифр числа
- Проверить количество разрядов в числе (двузначное, трёхзначное и т.д.)
- Применить базовые функции min(), max(), sum(), len(), abs()
- Провести какие-либо математические операции (сравнение, возведение в степень и т.д.)
С третьим пунктом мы разобрались еще в прошлой статье. Базовые математические операции не должны вызвать затруднений. А вот первым двум пунктам уделим внимание перед началом решения заданий.
Поиск последней цифры числа
Сначала вспомним, как найти последнюю цифру числа (разряд). Для этого есть два подхода:
- Взять остаток от деления на 10
- Перевести число в строку и взять последний символ по индексу -1
Продемонстрируем оба:
num = 1234
# Остаток от деления
last_digit = num % 10
print(last_digit)
>>>4
# Через строку
last_digit = str(num)[-1]
print(last_digit)
>>>4
Соответственно две последние цифры можно получить как остаток от деления на 100 или срезом [-2:]:
num = 1234
# Остаток от деления
last_digit = num % 100
print(last_digit)
>>>34
# Через строку
last_digit = str(num)[-2:]
print(last_digit)
>>>34
Выбирайте метод исходя из последующих операций. Например, если в условии сказано, что две последние цифры нужно сравнить с каким-то числом, логично будет остаться в целочисленном типе данных и использовать остаток от деления.
Определение количества разрядов
Здесь всё так же есть два способа:
- Через двойное неравенство
- Через перевод в строку и функцию len()
Как и в предыдущем примере: либо остаёмся в целочисленном типе, либо переводим значение в строку. Например, определим, что наше число num — четырёхзначное.
Четырёхзначное число должно быть строго больше 999 и меньше 10 000. Возможны и другие варианты записи двойного неравенства — выбирайте наиболее удобный. Мы запишем так:
num = 1234
is_4_digit = 999 < num < 10_000
print(is_4_digit)
>>>True
Во втором способе сначала переведём num в строковый тип данных, а затем проверим, что количество символов в строке равно четырём:
num = 1234
is_4_digit = len(str(num)) == 4
print(is_4_digit)
>>>True
Основные алгоритмы рассмотрели — переходим к решению заданий. Начнём с такой формулировки:
Задание 1712
«В файле содержится последовательность целых чисел.
Её элементы могут принимать целые значения от –10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа оканчиваются на нечётные цифры, различные для элементов в паре, затем минимальное из произведений модулей элементов таких пар.
В данной задаче под парой подразумевается два идущих подряд элемента последовательности.»
Давайте для начала выделим ключевые моменты:
- Работаем с парами идущих подряд элементов
- Числа могут быть как положительными, так и отрицательными (от –10 000 до 10 000)
- Ищем последние цифры каждого числа в паре
- Эти цифры должны быть нечётными и различными
- В ответе указываем: количество подходящих пар и минимальное произведение модулей этих чисел
Такое структурированное выделение ключевых моментов помогает лучше понять условие и не запутаться в формулировках. Старайтесь для каждого задания тезисно выписывать части условия и подчёркивать ключевые слова!
Начнём решение с чтения данных из файла и сохранения их в виде списка data:
with open('1712.txt') as f:
data = list(map(int, f))
Создадим список, в который будем собирать произведения модулей чисел всех подходящих пар:
with open('1712.txt') as f:
data = list(map(int, f))
ans = []
Напишем цикл для перебора пар идущих подряд элементов:
with open('1712.txt') as f:
data = list(map(int, f))
ans = []
for x, y in zip(data, data[1:]):
Внутри цикла найдём последнюю цифру каждого числа:
with open('1712.txt') as f:
data = list(map(int, f))
ans = []
for x, y in zip(data, data[1:]):
last_x = x % 10
last_y = y % 10
Проверим, что обе цифры нечётные (остаток от деления на 2 не равен нулю) и различные:
with open('1712.txt') as f:
data = list(map(int, f))
ans = []
for x, y in zip(data, data[1:]):
last_x = x % 10
last_y = y % 10
if last_x % 2 != 0 and last_y % 2 != 0 and last_x != last_y:
Как только условие выполняется, добавляем в список ans произведение модулей чисел x и y. Модуль числа получаем функцией abs():
with open('1712.txt') as f:
data = list(map(int, f))
ans = []
for x, y in zip(data, data[1:]):
last_x = x % 10
last_y = y % 10
if last_x % 2 != 0 and last_y % 2 != 0 and last_x != last_y:
ans.append(abs(x) * abs(y))
Остаётся только вывести на экран количество элементов в ans и минимальный элемент этого списка:
with open('1712.txt') as f:
data = list(map(int, f))
ans = []
for x, y in zip(data, data[1:]):
last_x = x % 10
last_y = y % 10
if last_x % 2 != 0 and last_y % 2 != 0 and last_x != last_y:
ans.append(abs(x) * abs(y))
print(len(ans), min(ans))
Запускаем программу и видим на экране два числа — 864 4683 — которые и будут ответом на это задание.