Найти в Дзене

Алгоритм решения задания 14 ЕГЭ по информатике. Часть 1

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

О задании

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

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

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

Как и многие другие задания ЕГЭ, задания №14 можно разделить на несколько типов. В ЕГЭ по информатике используются всего 3 типа этих заданий:

  1. В заданиях первого типа у нас нет неизвестных чисел в выражении. От нас требуется лишь корректно переписать заданное выражение и подсчитать количество нужных цифр в результате этого выражения.
  2. В заданиях второго типа выражения имеют одну неизвестную цифру. Например, в числе «13х5» третья цифра является неизвестной. В таких заданиях требуется перебором найти верное значение неизвестной цифры, при котором будет выполняться условие задания.
  3. И, наконец, в заданиях третьего типа мы имеем дело с целым неизвестным числом внутри данного выражения. Здесь от нас требуется найти это неизвестное число, при котором будет выполняться определённое условие.

Каждому типу отведём свою статью. В данной же статье рассмотрим самый простой тип 14 заданий – первый. Научимся корректно записывать выражения с помощью операторов Python и находить в числе количество нужных цифр. Давайте приступать!

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

Все решения первого типа данных заданий заключается в правильном выполнении двух пунктов:

  1. Записи предложенного арифметического выражения на языке Python
  2. Нахождении в результате этого выражения количества требуемых цифр

Давайте разбираться по порядку. Начнём с записи арифметических выражений. Рассмотрим простой пример: «дано арифметическое выражение 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:

  1. 7233 : 10 = 723, остаток 3
  2. 723 : 10 = 72, остаток 3
  3. 72 : 10 = 7, остаток 2
  4. 7 : 10 = 0, остаток 7

Таким образом, после каждого действия мы можем работать с конкретной цифрой этого числа, например, определять, подходит ни она под условия или нет. Так, если бы перед нами стоял вопрос «определите количество троек в результате выражения 2 * 5 ** 2 + 3 * 7 ** 4 – 20», то мы бы смело могли сказать, что среди остатков от деления, равно как и среди цифр результата этого выражения, число 3 встречается ровно 2 раза.

Теперь давайте переложим все наши размышления на язык программирования. Запишем выражение в переменную num:

-2

При этом обратите внимание, что Python сам посчитает результат:

-3

Теперь нужно как-то получить цифры этого числа, то есть разложить его на разряды. Как мы уже говорили, есть несколько алгоритмов разложения числа на разряды. Мы рассмотрим самый простой из них: будем в цикле while брать остатки от деления исходного числа на 10 (для этого используется оператор «%»), затем «отрезать» последнюю цифру целочисленным делением (оператором «//»).

Записать этот алгоритм можно таким образом:

-4

Сразу сделаем несколько правок в нашем коде. Запись «num != 0» в условии цикла while станет ложной только тогда, когда переменная num будет равна 0. Но в Python значение 0 и так является ложным значением. Так что нет смысла писать «while num != 0», достаточно ограничиться такой записью «while num».

Теперь перейдём к выражению «num = num // 10». В Python есть операции с присвоением, которые позволяют одновременно выполнить арифметическую операцию и присвоить её результат переменной. Для этого используются арифметические операторы совместно со знаком присваивания «=». Например, целочисленное деление с присваиванием записывается так: «//=».

Рассмотрим это на простом примере. Нам нужно, чтобы в некоторой переменной a сохранился результат её деления на 5:

-5

Таким образом, можем переписать представленный выше код со всеми правками:

-6

Теперь вернёмся к заданному ранее вопросу: «определите количество цифр 3 в значении арифметического выражения 2 * 5 ** 2 + 3 * 7 ** 4 – 20». Как мы это реализуем в программе?

Очевидно, что если нам нужно что-то подсчитывать, то следует ввести некоторую переменную-счётчик. Назовём её count и приравняем к 0.

-7

Далее внутри цикла, вместо сохранения остатка от деления на 0 напишем условие: «если остаток от деления на 10 равен числу 3, то увеличиваем значение count на 1». В конце, вне цикла, выведем итоговое значение, сохранённое в count. А наш код будет выглядеть так:

-8

Отлично, задача решена! В целом, это упрощённый шаблонный код для решения 14 заданий первого типа. Но давайте подумаем, как он будет меняться от задания к заданию.

Почему мы здесь делили на 10? Очевидно, что это основание нашей системы счисления. А что, если нам придётся работать с другой системой счисления, допустим, с основанием 8?

На самом деле, в любой системе все будет работать аналогично. Если в десятичной системе, чтобы получить последнюю десятичную цифру, мы делили на 10. То, чтобы получить последнюю восьмеричную цифру, нужно спросить себя: «сколько раз это число делится на 8, и что остаётся лишним?».

Следовательно, делить будем на 8 и остаток от этого деления и будет последней восьмеричной цифрой числа! Давайте рассмотрим пример: пусть у нас есть число 334 в восьмеричной системе счисления. Поскольку что мы, что Python, умеем считать только в десятичной, то переведём это число в десятичную систему и получим 220.

Теперь нам нужно получить последнюю цифру восьмеричного числа 334 (это цифра 4). Для этого мы десятичную запись числа 334 – 220 – поделим на 8 и остаток от этого деления и будет искомой цифрой.

Запишем иначе:

220 = 27 * 8 (основание системы) + 4 (остаток от деления и последняя цифра числа 334)

Какой из этого сделаем вывод? Во всём нашем коде в зависимости от системы счисления будут меняться только делители (то есть вместо 10, будет основание нужной системы счисления).

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

-9

Действительно, число 7233 в восьмеричной системе записывается как 16101, с тремя единицами.

Обратите внимание, здесь мы заменили 10 на 8 и в строке «if num % 8 == 1:» 3 на 1, поскольку теперь нужно было подсчитать количество троек.

В итоге можем прийти к такому шаблонному коду для решения первого типа 14 заданий:

-10

Теперь научимся применять этот код для решения реальных заданий.

Пример 1

Начинаем мы с такой формулировки:

Задание 1419

«Значение арифметического выражения 3333 + 322 — 9111 — 9 записали в системе счисления с основанием 3. Определите количество цифр 2 в записи этого числа.»

Что же, решение здесь до банального простое и шаблонное. В приведённом выше коде вместо «система_счисления» пишем 3, а вместо «требуемая_цифра» – 2. И не ошибаемся в записи арифметического выражения, конечно.

Решение данного задания можем записать таким образом:

-11

В результате получаем число 131, которое и пишем в ответ.

Пример 2

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

Задание 1402

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

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

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

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

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

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

До незначащих нулей в нашем алгоритме мы все равно никак не дойдём, поэтому воспринимаем «значащий ноль» просто как цифру 0, на которую заменим нашу абстрактную переменную «требуемая_цифра». А основанием системы счисления в этом задании будет число 25.

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

А решение у нас будет выглядеть так:

-12

В результате получаем ответ на данное задание – число 10.

Пример 3

Закончим работу с первым типом 14 заданий такой формулировкой:

Задание 1423

«Значение арифметического выражения 2 · 21872020 + 7292021 — 2 · 2432022 + 812023 — 2 · 272024 — 6561 записали в системе счисления с основанием 27. Определите в 27-ричной записи числа количество цифр с числовым значением, превышающим 9.»

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

Но особых сложностей это не вызовет. Просто вместо строгого равенства «==» мы будем использовать знак больше «>» в условии «if num % 27 > 9:»

А весь наш код будет выглядеть следующим образом:

-13

После запуска программы видим на экране число 3367. Оно и будет ответом на это задание.

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

<<< Последняя статья Следующая статья >>>