14zad scaled

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

Подробно позиционные системы счисления, а также функции Python для работы с ними мы уже рассматривали в прошлой статье. Так что здесь не будем останавливаться на данной теме.

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

Кроме того, проверяется ваша способность выполнять базовые арифметические операции непосредственно в заданной системе счисления без предварительного перевода в десятичную.

При подготовке к этому заданию обратите особое внимание на отработку навыков быстрого перевода чисел между системами счисления, понимание взаимосвязи между двоичной, восьмеричной и шестнадцатеричной системами, а также на умение определять свойства числа по его записи в той или иной системе счисления.

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

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

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

Всего в задании 14 ЕГЭ по информатике на момент 2025 года существует 6 различных типов формулировок. Они отличаются друг от друга количеством неизвестных, количеством оснований и величиной основания используемой системы счисления. В данной статье мы разберем 3 наиболее актуальных типа 14 задания, которые с наибольшей вероятностью попадутся вам на экзамене.

Тип 1. Выражение с неизвестным числом

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

Рассмотрим такую формулировку задания 15 первого типа:

«Значение арифметического выражения 7170 + 7100 – x, где x – целое положительное число, не превышающее 2030, записали в 7-ричной системе счисления. Определите наибольшее значение x, при котором в 7-ричной записи числа, являющегося значением данного арифметического выражения, содержится ровно 71 нуль.
В ответе запишите число в десятичной системе счисления»

Что нам нужно отсюда подчеркнуть? Для начала усвоим, что x у нас целое положительное число, не превышающая 2030. То есть неизвестная величина принадлежит следующему диапазону: 1<= x <= 2030. Это нам понадобится при формировании диапазона для цикла.

Также отметим, что будем искать наибольшее значение. То есть логично будет пойти «сверху вниз», от числа 2030 до 1. Или же перевернуть через срез диапазон от 1 до 2031 — range(1, 2031)[::-1].

Поскольку нам нужно найти все значения x, удовлетворяющие условию, то логично здесь использовать цикл for для перебора значений.

И самая интересная часть задания. Нужно найти количество нулей в семеричной записи числа. Для поиска количества чисел N в числе num, записанном в системе счисления с основанием sys можно использовать такую конструкцию (количество чисел, удовлетворяющих условию, записываем в переменную count):

count = 0
while num:
    if num % sys == N:
        count += 1
    num //= sys

Поскольку здесь необходимо найти количество нулей, равное 71, пишем следующее условие и, как только оно выполнится, сразу выводим значение на экран и останавливаем работу цикла оператором break:

# Если ровно 71 нуль
if count == 71:
    # Выводим x
    print(x)
    # Завершаем цикл
    break

Полный код для решения этого задания выглядит так:

# x целое положительное не превышает 2030
# Нужно найти наибольшее => инвертируем range
for x in range(1, 2031)[::-1]:
    # Выражение
    num = 7 ** 170 + 7 ** 100 - x
    # Подсчёт нулей
    count = 0
    # Поиск нулей в 7-чной записи
    while num:
        if num % 7 == 0:
            count += 1
        num //= 7
    # Если ровно 71 нуль
    if count == 71:
        # Выводим x
        print(x)
        # Завершаем цикл
        break

Ответ в этом задании — 2029.

Пример 1

«Значение арифметического выражения 62030 + 6100 – х, где х – целое положительное число, не превышающее 2030, записали в 6-ричной системе счисления. Определите наибольшее количество нулей, которое может содержать число, являющееся 6-ричной записью значения данного арифметического выражения»

Это довольно необычное задание, здесь требуется найти не значение x, а наибольшее количество нулей, которое может содержать число. Необычно оно тем, что при такой формулировке придётся держать количество нулей для каждой шестеричной записи в одном списке и только потом определять максимальное значение в этом списке.

Здесь довольно длительные вычисления, так что будьте готовы, что программа может работать долго.

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

На деле, такой подход лишь немного быстрее используемого в прошлом задании.

# Подсчёт нулей (функция)
def count_zero(num):
    count = 0
    # Поиск нулей в 6-чной записи
    while num:
        if num % 6 == 0:
            count += 1
        num //= 6
    return count

# Ищем максимальное кол-во нулей
max_zeros = max(count_zero(6 ** 2030 + 6 ** 100 - x)
                for x in range(1, 2031))

print(max_zeros)

В ответе получаем число 1934

Тип 2. Выражение без неизвестных

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

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

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

Значащие нули — это нули, которые несут информацию о величине числа. Они являются существенной частью числа и не могут быть отброшены без изменения его значения.

Незначащие нули — это нули, которые используются только для удобства записи числа и не влияют на его величину. Их можно отбросить, и значение числа при этом не изменится.

Давайте рассмотрим конкретные примеры:

Число 1 можно записать по-разному: 01, 001, 0001. При чем все эти значения будут равны, мы просто дописывали слева от единицы какое-то количество нулей, которые никак не влияли на величину числа. Такие нули являются незначащими.

Если будем добавлять нули справа от единицы, то получим такие результаты: 1, 10, 100, 1000. Эти числа уже имеют разные значения и убрав один ноль мы изменим порядок числа. Следовательно, нули внутри числа будут являться значащими.

Теперь рассмотрим формулировку задания 14 второго типа:

«Значение арифметического выражения 3 ⋅ 31258 + 2 ⋅ 6257 – 4 ⋅ 6256 + 3 ⋅ 1255 – 2 ⋅ 254 – 2025 записали в системе счисления с основанием 25. Сколько значащих нулей содержится в этой записи?»

В том, чтобы переписать выражение, здесь не должно возникнуть сложностей. Помните, что умножение в Python обозначается одной «звездой» (*), а возведение в степень — двумя (**).

Что же тут будет со значащими нулями? Рассмотрим такой цикл:

while num:
    if num % 25 == 0:
        count += 1
    num //= 25

Здесь переменная num последовательно делится на 25 и цикл останавливается, когда значение num становится равным 0. Следовательно, в такой конструкции у нас всегда будут учитываться только значащие нули числа.

Полный код решения этого задания ниже.

# Выражение из условия
num = (3 * 3125 ** 8 + 2 * 625 ** 7 - 5 * 625 ** 6
       + 3 * 125 ** 5 - 2 * 25 ** 4 - 2025)
# Подсчёт нулей
count = 0

# Поиск нулей в 25-чной записи
while num:
    if num % 25 == 0:
        count += 1
    num //= 25

print(count)

На экране видим ответ на это задание — 10.

Пример 2

«Определите в 25-ричной записи числа количество цифр с числовым значением, превышающим 10: 4 ⋅ 31252019 + 3 ⋅ 6252020 – 2 ⋅ 1252021 + 252022 – 4 ⋅ 52023 – 2024»

Здесь будем искать не количество значащих нулей, а количество любых цифр больше 10. Можем воспользоваться уже рассмотренным кодом, заменив условие на такое:

if num % 25 > 10:

То есть удовлетворять условию будут любые цифры 25-ричной системы счисления, значение которых больше 10.

Код к этому заданию такой:

# Выражение из условия
num = (4 * 3125 ** 2019 + 3 * 625 ** 2020 - 2 * 125 ** 2021
       + 25 ** 2022 - 4 * 5 ** 2023 - 2024)
# Подсчёт нулей
count = 0

# Поиск нулей в 25-чной записи
while num:
    if num % 25 > 10:
        count += 1
    num //= 25

print(count)

В ответе получим число 3030.

Тип 3. Выражение с одной неизвестной цифрой

В заданиях этого типа все также дано арифметическое выражение, записанное в определённой системе счисления (от 2 до 36). Но в каждом (обычно) числе этого выражения одна из цифр заменена на х. В каждом числе, соответственно, эта цифра одна и та же.

Рассмотрим такую формулировку:

«Операнды арифметического выражения записаны в системе счисления с основанием 19.
​98897×2119 + 2×92319
В записи чисел переменной x обозначена неизвестная цифра из алфавита 19-ричной системы счисления. Определите наибольшее значение x, при котором значение данного арифметического выражения кратно 18.
Для найденного x вычислите частное от деления значения арифметического выражения на 18 и укажите его в ответе в десятичной системе счисления.
Основание системы счисления указывать не нужно
»

Для решения заданий 14 этого типа будем путём перебора всех значений в цикле будем искать нужное значение переменной x, при котором выполняется заданное условие (здесь: значение выражение кратно 18). При чем обратите внимание, в ответ требуется дать не само значение x, а результат какой-либо арифметической операции с этим x (здесь: частное от деления x на 18).

Как нам проверить кратность арифметического выражения какому-то числу?

Для начала, можно записать каждый член выражения в виде строки с переменной x и перевести его в целое число в десятичной системе счисления. Например, в данном задании операнды арифметического выражения будем записывать так:

# 98897x21
n1 = int(f'98897{x}21', 19)
# 2x923
n2 = int(f'2{x}923', 19)

Эта запись использует f-строки, но вы также можете пользоваться конкатенацией строки или методом format(), чтобы записать число с переменной внутри него.

Теперь вернёмся к перебору значений для x. Поскольку x — это цифра какой-либо системы счисления, то и принимать значения эта переменная может строго внутри алфавита этой системы счисления. То есть здесь в цикле for будем использовать итерацию по элементам списка, в котором находится алфавит системы счисления.

Формирование такого алфавита мы уже рассматривали в прошлой статье.

В данном задании будем перебирать x в обратном порядке от последней до первой цифры 19-ричной системы счисления. Это можно записать так:

from string import digits, ascii_uppercase

alph = digits + ascii_uppercase

# Перебираем значения x от наибольшего
for x in alph[:19][::-1]:

Теперь собираем вместе все части кода выводим ответ:

from string import digits, ascii_uppercase

alph = digits + ascii_uppercase

# Перебираем значения x от наибольшего
for x in alph[:19][::-1]:
    # 98897x21
    n1 = int(f'98897{x}21', 19)
    # 2x923
    n2 = int(f'2{x}923', 19)
    # Выражение целиком
    res = n1 + n2
    # Если значение кратно 18
    if res % 18 == 0:
        # Частное от деления на 18
        print(res // 18)
        # Завершаем цикл
        break

Получаем число 469034148.

Пример 3

«Операнды арифметического выражения записаны в системе счисления с основанием 27.
123×2427 + 135×7827
В записи чисел переменной x обозначена неизвестная цифра из алфавита 27-ричной системы счисления. Определите наибольшее значение x, при котором значение данного арифметического выражения кратно 26. Для найденного значения x вычислите частное от деления значения арифметического выражения на 26 и укажите его в ответе в десятичной системе счисления. Основание системы счисления указывать не нужно»

Решение здесь, по большому счёту, аналогично рассмотренному выше. Алфавит теперь формируется до 27 символа, а в условии проверяем кратность 26 и выводим частное от деления значения выражения на 26, после чего завершаем цикл оператором break. Поскольку здесь снова требуется наибольший x, то идем «сверху вниз» используя срез [::-1].

Полный код решения следующий:

from string import digits, ascii_uppercase

alph = digits + ascii_uppercase

# Перебираем значения x от наибольшего
for x in alph[:27][::-1]:
    # 123x24
    n1 = int(f'123{x}24', 27)
    # 135x78
    n2 = int(f'135{x}78', 27)
    # Выражение целиком
    res = n1 + n2
    # Если значение кратно 26
    if res % 26 == 0:
        # Частное от деления на 26
        print(res // 26)
        # Завершаем цикл
        break

Ответом в этом задании будет число 1213206.