Тема 5. Алгоритмы – анализ простейших алгоритмов

5.01 Запись числа в двоичной системе счисления

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела алгоритмы – анализ простейших алгоритмов
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#30294

Алгоритм получает на вход натуральное число N  > 1  и строит по нему новое число R  следующим образом:

  1. Строится двоичная запись числа N  .
  2. В этой записи последний встречаемый ноль заменяется на первые две цифры полученной записи. Если нуля нет в записи числа, алгоритм аварийно завершается.
  3. Запись записывается справа налево (в обратную сторону).
  4. Результат переводится в десятичную систему счисления.

Для скольких значений N  в результате работы алгоритма получится число 255  ?

Показать ответ и решение

Решение 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)

Ответ: 5

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

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

Бесплатное онлайн-обучение

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

Налоговые вычеты

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

Специальное предложение
для учителей

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

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!