О задании
В задании 14 ЕГЭ по информатике проверяются фундаментальные знания и навыки работы с позиционными системами счисления, которые лежат в основе представления информации в компьютерных системах. От экзаменуемого требуется глубокое понимание принципов записи чисел в различных системах счисления, включая двоичную, восьмеричную и шестнадцатеричную, а также умение выполнять переводы между ними и производить арифметические операции.
Подробно позиционные системы счисления, а также функции Python для работы с ними мы уже рассматривали в прошлой статье. Так что здесь не будем останавливаться на данной теме.
Особое внимание в этом задании следует уделить пониманию свойств позиционной записи чисел, таких как зависимость количества цифр от основания системы счисления и признаки делимости.
Как и многие другие задания ЕГЭ, задания №14 можно разделить на несколько типов. В ЕГЭ по информатике используются всего 3 типа этих заданий:
- В заданиях первого типа у нас нет неизвестных чисел в выражении. От нас требуется лишь корректно переписать заданное выражение и подсчитать количество нужных цифр в результате этого выражения.
- В заданиях второго типа выражения имеют одну неизвестную цифру. Например, в числе «13х5» третья цифра является неизвестной. В таких заданиях требуется перебором найти верное значение неизвестной цифры, при котором будет выполняться условие задания.
- И, наконец, в заданиях третьего типа мы имеем дело с целым неизвестным числом внутри данного выражения. Здесь от нас требуется найти это неизвестное число, при котором будет выполняться определённое условие.
Каждому типу отведём свою статью. В данной же статье рассмотрим самый простой тип 14 заданий – первый. Научимся корректно записывать выражения с помощью операторов Python и находить в числе количество нужных цифр. Давайте приступать!
Алгоритм решения
Все решения первого типа данных заданий заключается в правильном выполнении двух пунктов:
- Записи предложенного арифметического выражения на языке Python
- Нахождении в результате этого выражения количества требуемых цифр
Давайте разбираться по порядку. Начнём с записи арифметических выражений. Рассмотрим простой пример: «дано арифметическое выражение 2 · 52 + 3 · 74 – 20».
Записать такое выражение на языке Python, обычно, не составляет труда. Единственное, что нужно знать – какие операторы Python используются для записи математических действий. Если со сложением и вычитанием все просто – это привычные нам операторы «+» и «-», соответственно, то с умножением и возведением в степень немного сложнее.
Для операции умножения в Python используется оператор «звездочка» – «*». Для возведения в степень – две «звездочки», то есть «**».
Таким образом, на языке Python приведённое выше арифметическое выражение можно записать так: «2 * 5 ** 2 + 3 * 7 ** 4 — 20».
С самым лёгким разобрались. Теперь перейдём ко второму пункту алгоритма – к нахождению цифр числа. Для этого есть несколько алгоритмов, но сначала давайте подумаем, как бы мы определяли цифры числа вручную, на бумаге?
Для примера рассмотрим результат приведённого выше выражения – число 7233. Самым очевидным способом «отщипывать» по цифре от этого числа является взятие остатка от деления его на 10: 7233 : 10 = 723, остаток 3.
Отлично, мы получили последнюю цифру числа 7233. А как быть с остальными? Все очень просто, теперь мы будем делить на 10 не само число, а результат предыдущего деления – 723. И так будем продолжать до конца, пока от числа не останется 0:
- 7233 : 10 = 723, остаток 3
- 723 : 10 = 72, остаток 3
- 72 : 10 = 7, остаток 2
- 7 : 10 = 0, остаток 7
Таким образом, после каждого действия мы можем работать с конкретной цифрой этого числа, например, определять, подходит ни она под условия или нет. Так, если бы перед нами стоял вопрос «определите количество троек в результате выражения 2 * 5 ** 2 + 3 * 7 ** 4 – 20», то мы бы смело могли сказать, что среди остатков от деления, равно как и среди цифр результата этого выражения, число 3 встречается ровно 2 раза.
Теперь давайте переложим все наши размышления на язык программирования. Запишем выражение в переменную num:
При этом обратите внимание, что Python сам посчитает результат:
Теперь нужно как-то получить цифры этого числа, то есть разложить его на разряды. Как мы уже говорили, есть несколько алгоритмов разложения числа на разряды. Мы рассмотрим самый простой из них: будем в цикле while брать остатки от деления исходного числа на 10 (для этого используется оператор «%»), затем «отрезать» последнюю цифру целочисленным делением (оператором «//»).
Записать этот алгоритм можно таким образом:
Сразу сделаем несколько правок в нашем коде. Запись «num != 0» в условии цикла while станет ложной только тогда, когда переменная num будет равна 0. Но в Python значение 0 и так является ложным значением. Так что нет смысла писать «while num != 0», достаточно ограничиться такой записью «while num».
Теперь перейдём к выражению «num = num // 10». В Python есть операции с присвоением, которые позволяют одновременно выполнить арифметическую операцию и присвоить её результат переменной. Для этого используются арифметические операторы совместно со знаком присваивания «=». Например, целочисленное деление с присваиванием записывается так: «//=».
Рассмотрим это на простом примере. Нам нужно, чтобы в некоторой переменной a сохранился результат её деления на 5:
Таким образом, можем переписать представленный выше код со всеми правками:
Теперь вернёмся к заданному ранее вопросу: «определите количество цифр 3 в значении арифметического выражения 2 * 5 ** 2 + 3 * 7 ** 4 – 20». Как мы это реализуем в программе?
Очевидно, что если нам нужно что-то подсчитывать, то следует ввести некоторую переменную-счётчик. Назовём её count и приравняем к 0.
Далее внутри цикла, вместо сохранения остатка от деления на 0 напишем условие: «если остаток от деления на 10 равен числу 3, то увеличиваем значение count на 1». В конце, вне цикла, выведем итоговое значение, сохранённое в count. А наш код будет выглядеть так:
Отлично, задача решена! В целом, это упрощённый шаблонный код для решения 14 заданий первого типа. Но давайте подумаем, как он будет меняться от задания к заданию.
Почему мы здесь делили на 10? Очевидно, что это основание нашей системы счисления. А что, если нам придётся работать с другой системой счисления, допустим, с основанием 8?
На самом деле, в любой системе все будет работать аналогично. Если в десятичной системе, чтобы получить последнюю десятичную цифру, мы делили на 10. То, чтобы получить последнюю восьмеричную цифру, нужно спросить себя: «сколько раз это число делится на 8, и что остаётся лишним?».
Следовательно, делить будем на 8 и остаток от этого деления и будет последней восьмеричной цифрой числа! Давайте рассмотрим пример: пусть у нас есть число 334 в восьмеричной системе счисления. Поскольку что мы, что Python, умеем считать только в десятичной, то переведём это число в десятичную систему и получим 220.
Теперь нам нужно получить последнюю цифру восьмеричного числа 334 (это цифра 4). Для этого мы десятичную запись числа 334 – 220 – поделим на 8 и остаток от этого деления и будет искомой цифрой.
Запишем иначе:
220 = 27 * 8 (основание системы) + 4 (остаток от деления и последняя цифра числа 334)
Какой из этого сделаем вывод? Во всём нашем коде в зависимости от системы счисления будут меняться только делители (то есть вместо 10, будет основание нужной системы счисления).
Давайте тогда найдём, сколько будет единиц в восьмеричной записи нашего выражения. В программе это записывается таким образом:
Действительно, число 7233 в восьмеричной системе записывается как 16101, с тремя единицами.
Обратите внимание, здесь мы заменили 10 на 8 и в строке «if num % 8 == 1:» 3 на 1, поскольку теперь нужно было подсчитать количество троек.
В итоге можем прийти к такому шаблонному коду для решения первого типа 14 заданий:
Теперь научимся применять этот код для решения реальных заданий.
Пример 1
Начинаем мы с такой формулировки:
«Значение арифметического выражения 3333 + 322 — 9111 — 9 записали в системе счисления с основанием 3. Определите количество цифр 2 в записи этого числа.»
Что же, решение здесь до банального простое и шаблонное. В приведённом выше коде вместо «система_счисления» пишем 3, а вместо «требуемая_цифра» – 2. И не ошибаемся в записи арифметического выражения, конечно.
Решение данного задания можем записать таким образом:
В результате получаем число 131, которое и пишем в ответ.
Пример 2
Рассмотрим следующую формулировку:
«Значение арифметического выражения 3 ⋅ 31258 + 2 ⋅ 6257 — 4 ⋅ 6256 + 3 ⋅ 1255 — 2 ⋅ 254 — 2025 записали в системе счисления с основанием 25. Сколько значащих нулей содержится в этой записи?»
Не пугайтесь фразы «значащих нулей»! На решение это вообще никак не повлияет. Но, давайте все же вспомним, что это за нули такие и чем они отличаются от незначащих.
Значащие нули – это нули, которые несут информацию о величине числа. Они являются существенной частью числа и не могут быть отброшены без изменения его значения.
Незначащие нули – это нули, которые используются только для удобства записи числа и не влияют на его величину. Их можно отбросить, и значение числа при этом не изменится. Давайте рассмотрим конкретные примеры.
Число 1 можно записать по-разному: 01, 001, 0001. Причём все эти значения будут равны, мы просто дописывали слева от единицы какое-то количество нулей, которые никак не влияли на величину числа. Такие нули являются незначащими.
Если будем добавлять нули справа от единицы, то получим такие результаты: 1, 10, 100, 1000. Эти числа уже имеют разные значения, и убрав один ноль мы изменим порядок числа. Следовательно, нули внутри числа будут являться значащими.
До незначащих нулей в нашем алгоритме мы все равно никак не дойдём, поэтому воспринимаем «значащий ноль» просто как цифру 0, на которую заменим нашу абстрактную переменную «требуемая_цифра». А основанием системы счисления в этом задании будет число 25.
Кстати, обратите внимание, что такие большие выражения вы можете записывать на нескольких строках, чтобы это было наглядней и вы не потерялись в такой записи. Только не забудьте окружить это выражение скобками!
А решение у нас будет выглядеть так:
В результате получаем ответ на данное задание – число 10.
Пример 3
Закончим работу с первым типом 14 заданий такой формулировкой:
«Значение арифметического выражения 2 · 21872020 + 7292021 — 2 · 2432022 + 812023 — 2 · 272024 — 6561 записали в системе счисления с основанием 27. Определите в 27-ричной записи числа количество цифр с числовым значением, превышающим 9.»
Обратите внимание, теперь мы ищем не количество вхождения определённой цифры, а сразу нескольких цифр, со значением, большим 9.
Но особых сложностей это не вызовет. Просто вместо строгого равенства «==» мы будем использовать знак больше «>» в условии «if num % 27 > 9:»
А весь наш код будет выглядеть следующим образом:
После запуска программы видим на экране число 3367. Оно и будет ответом на это задание.
На этом мы завершаем разбор первого типа 14 заданий. В следующей статье познакомимся с алгоритмом решения второго типа этих заданий и научимся подбирать значение для неизвестной цифры арифметического выражения.