Задание №5 ЕГЭ Информатика с ответом и решением
Ответ: 61
Условие
Автомат обрабатывает натуральное число N (0 ≤ N ≤ 255) по следующему алгоритму.
1. Строится восьмибитная двоичная запись числа N.
2. Все цифры двоичной записи заменяются на противоположные (0 на 1, 1 на 0).
3. Полученное число переводится в десятичную запись.
4. Из нового числа вычитается исходное, полученная разность выводится на экран.
Пример. Дано число N = 13. Алгоритм работает следующим образом.
1. Восьмибитная двоичная запись числа N: 00001101.
2. Все цифры заменяются на противоположные, новая запись: 11110010.
3. Десятичное значение полученного числа 242.
4. На экран выводится число 242 − 13 = 229.
Какое число нужно ввести в автомат, чтобы в результате получилось 133?
Подсказки — как подойти к решению
- Восьмибитная запись — это всегда ровно восемь разрядов с ведущими нулями. Инверсия такой записи дополняет число до наибольшего восьмибитного значения, поэтому результат работы автомата выражается через N одним равенством.
- Составь уравнение: инверсия равна разности константы и N, а автомат выводит инверсию минус N, то есть N встречается дважды. Реши линейное уравнение и проверь, что найденное N укладывается в разрешённый диапазон.
Решение
Заметим, что инверсия двоичной восьмибитной записи числа в сумме с исходным числом дает 11111111, то есть 255. (В исходном примере: 00001101 + 11110010 = 11111111.) Следовательно, если исходное число равно N, то инвертированное число равно 255 − N. Затем автомат осуществляет вычитание, вычисляя 255 − 2N.
Поэтому, чтобы найти число, которое нужно ввести в автомат для получения 133, нужно решить уравнение 255 − 2N = 133. Тем самым, искомое число равно 61.
Ответ: 61.
Приведём другое решение на языке Python.
for n in range(256):
s = bin(n)[2:] # перевод в двоичную систему
s = str(s)
if len(s) < 8:
s = '0' * (8 - len(s)) + s
s = s.replace('1', '*')
s = s.replace('0', '1')
s = s.replace('*', '0')
r = int(s, 2) # перевод в десятичную систему
if r - n == 133:
print(n)
Приведём решение Виктории Фокиной на языке Python.
for n in range(256):
n2 = bin(n)[2:].zfill(8)
n2 = n2.replace('1','*')
n2 = n2.replace('0','1')
n2 = n2.replace('*','0')
r = int(n2,2)
total = r - n
if total == 133:
print(n)
Приведём решение Лилии Салимуллиной на языке Python.
for n in range(0,256):
r = bin(n)[2:]
r = 11111111 - int(r)
r = int(str(r),2)
r = r - n
if r == 133:
print(n)
Приведём решение Юрия Красильникова на языке Python.
print(*[n for n in range(256) if (n^255) - n == 133])
Типичные ошибки
- Ты приравнял инверсию к результату и забыл, что автомат ещё вычитает исходное число. В выражении для вывода N стоит дважды, поэтому одной разностью задача не решается — выпиши формулу целиком.
В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №5 по информатике