5.01 Запись числа в двоичной системе счисления
Ошибка.
Попробуйте повторить позже
Алгоритм получает на вход натуральное число и строит по нему новое число
следующим образом:
- Строится двоичная запись числа
.
- В этой записи последний встречаемый ноль заменяется на первые две цифры полученной записи. Если нуля нет в записи числа, алгоритм аварийно завершается.
- Запись записывается справа налево (в обратную сторону).
- Результат переводится в десятичную систему счисления.
Для скольких значений в результате работы алгоритма получится число
?
Решение 1
В этой задаче нам нужно определить количество чисел N, для которых алгоритм преобразования двоичной записи даёт результат 255. Сначала мы организуем перебор всех чисел N, начиная с 2 и до некоторого верхнего предела (в данном случае 10000) с помощью цикла for i in range(2, 10000). Для каждого числа мы строим его двоичную запись с помощью bin(i)[2:]. Здесь bin(i) возвращает строку вида ’0b...’, поэтому мы срезаем первые два символа ’0b’, чтобы получить только последовательность нулей и единиц, которую присваиваем переменной s.
Далее мы проверяем, содержит ли двоичная запись хотя бы один ноль с помощью условия if s.count(’0’) > 0:. Если нуля нет, алгоритм должен аварийно завершаться, поэтому мы просто пропускаем такие числа. Если нули есть, то нам необходимо найти индекс последнего нуля в записи. Для этого мы перебираем индексы строки в обратном порядке с помощью for j in range(len(s) - 1, -1, -1) и останавливаемся на первом встреченном нуле, сохраняя его индекс в переменной ind.
После нахождения последнего нуля мы формируем новую строку x, где на месте этого нуля вставляем первые две цифры исходной двоичной записи s[0] и s[1], используя конструкцию x = s[:ind] + s[0] + s[1] + s[ind + 1:]. Далее строку x разворачиваем справа налево с помощью среза x[::-1]. Полученную обратную запись переводим в десятичное число с помощью int(x, 2) и сравниваем с целевым результатом 255. Если совпадение есть, увеличиваем счётчик ans на 1. В конце выводим общее количество подходящих чисел с помощью print(ans).
# Инициализируем счётчик подходящих чисел ans = 0 # Перебираем все числа N от 2 до 9999 включительно for i in range(2, 10000): # Получаем двоичную запись числа N без префикса ’0b’ s = bin(i)[2:] # Проверяем, есть ли в записи хотя бы один ноль if s.count(’0’) > 0: # Инициализируем переменную для индекса последнего нуля ind = ’’ # Перебираем индексы строки в обратном порядке, чтобы найти последний ноль for j in range(len(s) - 1, -1, -1): if s[j] == ’0’: # Сохраняем индекс последнего нуля и выходим из цикла ind = j break # Формируем новую строку: заменяем найденный ноль первыми двумя цифрами исходной записи x = s[:ind] + s[0] + s[1] + s[ind + 1:] # Разворачиваем строку справа налево x = x[::-1] # Переводим результат обратно в десятичную систему и проверяем, равен ли он 255 if int(x, 2) == 255: # Если да, увеличиваем счётчик подходящих чисел ans += 1 # Выводим общее количество чисел, удовлетворяющих условию print(ans)
Решение 2
Сначала мы организуем перебор всех чисел N от 2 до некоторого верхнего предела (в данном случае 10000) с помощью цикла for i in range(2, 10000). Для каждого числа строим его двоичную запись с помощью bin(i)[2:]. Здесь функция bin(i) возвращает строку вида ’0b...’, поэтому срез [2:] убирает префикс ’0b’, оставляя только последовательность нулей и единиц, которую мы сохраняем в переменной s.
Далее проверяем, встречается ли в двоичной записи хотя бы один ноль с помощью if s.count(’0’) > 0:. Если ноля нет, алгоритм должен аварийно завершаться, поэтому такие числа пропускаем. Если ноль есть, мы разворачиваем строку s справа налево с помощью s[::-1] и применяем метод replace(’0’, s[0:2][::-1], 1), который заменяет первый встреченный ноль в развёрнутой строке на первые две цифры исходной записи в обратном порядке. Это позволяет реализовать условие задачи о замене последнего нуля оригинальной записи на первые две цифры. После этого получаем итоговую строку двоичной записи, которую переводим в десятичную систему с помощью int(s, 2) и сравниваем с целевым значением 255. Если результат совпадает, увеличиваем счётчик ans на 1. После окончания цикла выводим общее количество подходящих чисел с помощью print(ans).
# Инициализируем счётчик подходящих чисел ans = 0 # Перебираем все числа N от 2 до 9999 включительно for i in range(2, 10000): # Получаем двоичную запись числа N без префикса ’0b’ s = bin(i)[2:] # Проверяем, есть ли в записи хотя бы один ноль if s.count(’0’) > 0: # Разворачиваем строку справа налево и заменяем первый встреченный ноль # на первые две цифры исходной двоичной записи, взятые в обратном порядке s = s[::-1].replace(’0’, s[0:2][::-1], 1) # Переводим полученную строку в десятичное число и проверяем, равно ли оно 255 if int(s, 2) == 255: # Если результат совпадает, увеличиваем счётчик подходящих чисел ans += 1 # Выводим общее количество чисел, удовлетворяющих условию print(ans)
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!