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

5.02 Запись числа в другой системе счисления

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

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

Задача 1#63913

Автомат обрабатывает натуральное число N < 256 по следующему алгоритму:

1) Строится восьмибитная двоичная запись числа N.

2) Инвертируются все разряды исходного числа, кроме последней единицы и стоящих за ней нулей (0 заменяется на 1, 1 на 0).

3) Полученное число переводится в десятичную систему счисления.

Для какого значения N результат работы алгоритма равен 98?

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

В данной задаче мы имеем дело с обработкой восьмибитной двоичной записи числа N, где N — натуральное число меньше 256. Для каждого такого числа сначала строится строковое представление в двоичной системе длиной ровно 8 символов с помощью функции bin и дополнением нулями слева. Далее происходит инвертирование разрядов — то есть замена 0 на 1 и 1 на 0 — но не для всех символов подряд. Мы инвертируем все разряды, начиная с начала строки, до момента, пока не достигнем последней единицы в двоичной записи (и вместе с ней и следующими за ней нулями, то есть до конца строки). Для поиска этой позиции мы в цикле по символам двоичной строки проверяем, если текущий символ равен ’1’ и при этом справа больше нет единиц, значит мы достигли последней единицы, и с этого момента копируем оставшуюся часть строки без изменений. Все символы до этой позиции инвертируем. Полученную изменённую двоичную строку затем переводим обратно в десятичное число. После такого преобразования проверяем, равно ли полученное число 98. Перебирая все числа от 0 до 255, мы находим то число N, для которого результат работы алгоритма равен 98.

for number in range(256):  # Перебираем все числа от 0 до 255 включительно
    binary_number = bin(number)[2:].zfill(8)  # Получаем 8-битную двоичную запись числа number
    new_bin = ’’  # Инициализируем пустую строку для формирования новой двоичной записи
    for i in range(len(binary_number)):  # Проходим по каждому разряду двоичной строки
        # Проверяем, что текущий символ равен ’1’ и справа нет больше единиц
        if binary_number[i] == ’1’ and binary_number[i+1:].count(’1’) == 0:
            new_bin += binary_number[i:]  # Добавляем в результат оставшуюся часть без изменений
            break  # Прекращаем инвертирование, т.к. достигли последней единицы
        else:
            # Если текущий символ равен ’1’, инвертируем его в ’0’
            if binary_number[i] == ’1’:
                new_bin += ’0’
            else:
                # Если текущий символ равен ’0’, инвертируем его в ’1’
                new_bin += ’1’
    decimal_result = int(new_bin, 2)  # Переводим новую двоичную строку в десятичное число

    if decimal_result == 98:  # Проверяем, равен ли результат 98
        print(number)  # Выводим исходное число, при котором результат равен 98

Ответ: 158

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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