+7 995 326 44 86

info@future-step.ru

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

О задании

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

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

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

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

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

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

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

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

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

  1. Взять остаток от деления на 10
  2. Перевести число в строку и взять последний символ по индексу -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

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

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

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

  1. Через двойное неравенство
  2. Через перевод в строку и функцию 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 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа оканчиваются на нечётные цифры, различные для элементов в паре, затем минимальное из произведений модулей элементов таких пар.

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

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

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

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

Начнём решение с чтения данных из файла и сохранения их в виде списка 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 — которые и будут ответом на это задание.