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

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

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

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

Задача 21#30267Максимум баллов за задание: 1

Исполнитель Олень получает число и строит по нему новое число R  следующим образом:

  1. Строится двоичная запись числа N  .
  2. Вместо последней двоичной цифры дважды записывается вторая слева цифра двоичной записи.
  3. Результат переводится в десятичную систему.

Полученная таким образом запись (в ней на один разряд больше, чем в записи исходного числа N  ) является двоичной записью искомого числа R  .

Укажите такое наименьшее число N  , для которого Олень получит число, большее, чем 177  . В ответе это число запишите в десятичной системе счисления.

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью функции bin, затем используем срез [:-1], чтобы избавиться от последней цифры. С помощью сложения строк дважды дописываем в конец вторую слева цифру, которая имеет индекс 1. Осталось перевести результат в десятичную систему счисления, после чего получим R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 177. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.

for n in range(2, 1000):  # Перебор значений N от 2 до 999 включительно
    r = bin(n)[2:]  # Получаем двоичную запись числа N
    r = r[:-1] + r[1] + r[1]  # "Срезаем" последнюю цифру и дописываем два раза вторую слева
    r = int(r, 2)  # Получаем итоговое число в десятичной системе счисления
    if r > 177:  # Проверка выполнения условия
        print(n)
        break  # Первое выведенное N будет минимальным

Решение аналитически
Переведем 178 = 101100102  . Последние 2 цифры не совпадают с второй слева цифрой, получается ищем следующее.

Переведем 179 = 10110011
             2  . Также не совпадает.

Переведем 180 = 101101002  . Вторая слева и последние 2 совпадают. Обрубаем последние. 1011012  . Сейчас также нам не хватает обрубленной цифры, и чтобы вышло наименьшее N нужно взять 0. 10110102 = 9010  .

Ответ: 90

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

Задача 22#30268Максимум баллов за задание: 1

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

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

2. Вместо последней (самой правой) двоичной цифры дважды записывается вторая слева цифра двоичной записи.

3. Результат переводится в десятичную систему.

Пример. Дано число N = 19  . Алгоритм работает следующим образом:

1. Двоичная запись числа N  : 10011  .

2. Вторая слева цифра 0  , единица в конце записи заменяется на два нуля, новая запись 100100  .

3. Результат работы алгоритма R = 36  .

При каком наименьшем числе N  в результате работы алгоритма получится R > 48  ? В ответе запишите это число в десятичной системе счисления.

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью функции bin, затем избавляемся от последней цифры, используя срез [:-1]. Прибегнув к сложению строк, дважды дописываем в конец вторую слева цифру, которая имеет индекс 1. Осталось перевести результат в десятичную систему счисления, после чего получим R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 48. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.

for n in range(2, 1000):  # Перебор значений N > 1
    r = bin(n)[2:]  # Получаем двоичную запись числа N
    r = r[:-1] + r[1] + r[1]  # "Срезаем" последнюю цифру и дописываем два раза вторую слева
    r = int(r, 2)  # Получаем итоговое число в десятичной системе счисления
    if r > 48:  # Проверка выполнения условия
        print(n)
        break  # Первое выведенное N будет минимальным

Аналитическое решение:

Переведем 49 = 1100012  . Не совпадают.

Переведем 50 = 110010
          2  . Не совпадают.

Переведем 51 = 1100112  . Совпали. Обрубим 2  последние цифры и припишем 0  . 110002 = 2410  .

Ответ: 24

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

Задача 23#30269Максимум баллов за задание: 1

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

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

Пример. Дано число N = 18  . Алгоритм работает следующим образом:

  1. Двоичная запись числа N : 10010  .
  2. Вторая слева цифра 0  , новая запись 100100  .
  3. Вторая справа цифра 1  , новая запись 1001001  .
  4. Результат работы алгоритма R = 73  .

При каком наибольшем числе N  в результате работы алгоритма получится R < 90  ? В ответе запишите это число в десятичной системе счисления.

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью функции bin, затем, используя сложение строк, дописываем в конец вторую слева цифру, которая имеет индекс 1. Далее дописываем вторую справа цифру изначальной записи, которая имеет индекс -2 (вторая с конца). Осталось перевести результат в десятичную систему счисления, после чего получим R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, меньше ли оно 90. Если условие выполняется, запоминаем N. Важно отметить, что нет необходимости проверять, что текущее N – наибольшее, ведь цикл гарантирует, что N перебираются по возрастанию. Выводим последнее (наибольшее) подходящее N.

ans = 0  # Переменная для хранения наибольшего N
for i in range(2, 1000):  # Перебор значений N > 1
    s = bin(i)[2:]  # Получаем двоичную запись числа N
    s += s[1] + s[-2]  # Дописываем вторую слева цифру и вторую справа
    r = int(s, 2)  # Получаем итоговое число в десятичной системе счисления
    if r < 90:
        ans = i
print(ans)

Ответ: 22

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

Задача 24#30270Максимум баллов за задание: 1

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

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

2)К этой записи дописываются справа ещё два разряда по следующему правилу:

а)Дописывается справа бит чётности: 0, если в двоичном коде числа N было чётное число единиц, и 1, если нечётное;

б)К полученному результату дописывается ещё один бит чётности

Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R.

Укажите минимальное число N, после обработки которого с помощью этого алгоритма получается число, большее, чем 78. В ответе это число запишите в десятичной системе.

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью функции bin, затем вычисляем количество единиц с помощью метода count. Если это количество чётное, дописываем справа 0, используя конкатенацию строк (оператор +). Если нечётное, дописываем 1. Повторяем те же действия для изменённой двоичной записи, переводим результат в десятичную систему счисления, получаем R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 78. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.

for i in range(1, 1000):  # Перебираем числа N от 1 до 999 включительно
    s = bin(i)[2:]  # Перевод в двоичную систему

    # Вычисляем бит чётности
    if s.count("1") % 2 == 0:
        # Если количество единиц чётно, дописываем 0, иначе - 1
        s += "0"
    else:
        s += "1"

    # Повторяем предыдущий шаг, но уже для изменённой записи
    if s.count("1") % 2 == 0:
        s += "0"
    else:
        s += "1"

    if int(s, 2) > 78:  # Получаем R
        # Первое выведенное N будет минимальным
        print(i)  # Выводим N
        break  # Завершаем цикл

Аналитическое решение:

Если изначальное число N  имеет чётное количество единиц, то после добавления нуля количество единиц не изменится, а потому на следующем шаге также добавится ноль. Итого к числу допишут два нуля.

Если изначально число N  имеет нечётное количество единиц, то после добавления единицы количество единиц увеличится на 1, что означает, что количество единиц станет чётным числом, а значит на следующем шаге уже будут добавлять ноль. Итого к числу допишут единицу и ноль.

Значит мы будем проверять только числа, которые кончаются на 00  или 10  .

Могло ли получиться число 79  ? Нет, в двоичной СС оно выглядит как 10011112  , а значит получиться после алгоритма не могло.

Могло ли получиться число 80? В двоичной СС оно выглядит как 1010000
      2  . Так что вполне возможно. Если откинем последние две цифры, то у нас останется число 101002  , у него чётное число единиц, а значит после работы алгоритма к нему дописали бы два нуля, но это как раз те самые цифры, которые мы откинули, значит 101002 = 2010  и есть искомое число.

Ответ: 20

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

Задача 25#30271Максимум баллов за задание: 1

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

1) Число N переводим в двоичную запись.

2) К этой записи справа дописывается один разряд по следующему правилу: если количество единиц в двоичной записи числа больше количества нулей, то справа дописывается 1, иначе дописывается 0.

3) К полученной записи повторно применяется алгоритм из п.2.

Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N) является двоичной записью искомого числа R.

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

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа R необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью функции bin, затем вычисляем количество единиц и нулей с помощью метода count. Если единиц больше, дописываем 1, используя конкатенацию строк (оператор +). Иначе – дописываем 0. Повторяем те же действия для изменённой двоичной записи, переводим результат в десятичную систему счисления, получаем R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, меньше ли оно 99 и является ли наибольшим среди полученных. Если условие выполняется, обновляем наибольшее значение R. После завершения цикла выводим максимальное R, которое смогли найти.

mx = -1000  # Инициализация переменной для хранения максимального R < 99
for i in range(1, 1000):  # Перебираем числа N от 1 до 999 включительно
    s = bin(i)[2:]  # Перевод в двоичную систему

    # Вычисляем количество единиц и нулей, сравниваем
    if s.count("1") > s.count("0"):
        # Если единиц больше, дописываем 1, иначе - 0
        s += "1"
    else:
        s += "0"

    # Повторяем предыдущий шаг, но уже для изменённой записи
    if s.count("1") > s.count("0"):
        s += "1"
    else:
        s += "0"

    r = int(s, 2)  # Переводим в десятичную систему

    # Проверяем, что r < 99, то есть подходит по условию, и больше текущего максимального
    if r < 99 and r > mx:
        mx = r
print(mx)

Аналитическое решение

Заметим, что алгоритм добавляет ту цифру, которых больше у числа (если количество равно, то добавляется нуль). Если у числа N  было какое-то количество нулей и какое-то количество единиц, то добавляя какую-то цифру, их количество только увеличивается, а значит и на следующем шаге добавят эту же цифру. Значит к числу добавят  11  или 00  .

Нам нужно найти наибольшее число R  , которое могли получить после работы данного алгоритма. Могло ли получиться число 9810 = 11000102  ? Нет, так как оно кончается на 10, а мы знаем, что такое число не могло получиться после этого алгоритма.

Могло ли получиться число 9710 = 11000012  ? Нет, так как оно кончается на 01, а мы знаем, что такое число не могло получиться после этого алгоритма.

Могло ли получиться число 9610 = 11000002  ? Такое число могло получиться после этого алгоритма, но давайте проверим какое число тогда было бы без добавленных нулей – если уберём два нуля, то получим число 110002  , количество нулей больше, чем количество единиц, а значит к такому числу после работы алгоритма действительно добавляются два нуля, а значит 96 это наибольшее R  , которое могли получить после работы алгоритма.

Ответ: 96

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

Задача 26#30272Максимум баллов за задание: 1

На вход алгоритма "КХЪ" подаётся натуральное число Y.  Алгоритм строит по нему новое число X  следующим образом:

1. Строится двоичная запись числа Y.

2. В конец двоичной записи дописываются две первые цифры этой записи в обратном порядке.

3. В начало двоичной записи дописывается единица.

4. Результат переводится в десятичную систему и выводится на экран.

Пример. Дано число Y = 5.  Алгоритм работает следующим образом:

1. Двоичная запись числа Y :  101  .

2. В конец записи добавляются цифры 01  – первые две цифры в обратном порядке (сначала вторая, затем первая), получается 10101  .

3. В начало записи добавляется цифра 1  , получается 110101  .

4. На экран выводится число 53  .

Полученная таким образом запись является искомым числом X.  Укажите минимальное число X,  которое превышает число 50  и может являться результатом работы данного алгоритма. В ответе это число запишите в десятичной системе счисления.

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа X необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Сначала переводим число Y в двоичную строку с помощью функции bin, затем дописываем в конец две первые цифры, находящиеся под индексами 0 и 1, в обратном порядке. Следующим шагом добавляем 1 в начало. Переводим результат в десятичную систему счисления, получаем X.

Далее организуем перебор чисел Y в цикле for. Для каждого полученного значения X проверяем, превышает ли оно 50 и является ли наименьшим среди полученных. Если условие выполняется, обновляем наименьшее значение X. После завершения цикла выводим минимальное X, которое > 50.

mn = 10 ** 10  # Инициализация переменной для хранения минимального X > 50

for y in range(2, 1000):  # Перебираем числа N от 2 до 999 включительно
    s = bin(y)[2:]  # Перевод в двоичную систему
    s += s[1] + s[0]  # Дописываем первые две цифры в обратном порядке
    s = "1" + s  # Дописываем 1 в начало
    x = int(s, 2)  # Переводим в десятичную систему, получаем X

    # Проверяем, что X > 50, то есть подходит по условию, и меньше минимального
    if x > 50 and x < mn:
        mn = x
print(mn)

Ответ: 53

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

Задача 27#30278Максимум баллов за задание: 1

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

  1. Строится двоичная запись числа N  .
  2. В конец двоичной записи добавляются две цифры: 11  — если N  четное, 00  — если N  нечетное.
  3. Результат переводится в десятичную систему, затем от числа отнимается минимальное количество бит, которым можно закодировать N  чисел.
  4. Полученное число выводится на экран.

Пример. Дано число N = 56.  Алгоритм работает следующим образом:

  1. Двоичная запись числа N : 111000.
  2. В конец добавляются цифры 11  , так как 1110002 = 5610  — четное число. Получается 11100011  .
  3. Результат переводится в десятичную систему. 111000112 = 22710  . От 227  отнимается число 6  , так как это минимальное количество бит, которым можно закодировать 56  чисел.
  4. На экран выводится 221.

Укажите минимальное N  , при котором автомат выведет на экран число 126  .

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью функции bin, затем вычисляем чётность N с помощью взятия остатка от деления на 2 (% 2). Если N – чётное, дописываем 11, используя конкатенацию строк (оператор +). Иначе – дописываем 00. Переводим результат в десятичную систему счисления, вычитаем минимальное количество бит, которым можно закодировать N чисел. Для этого используем len(bin(N - 1)[2:]), так как при кодировании чисел от 0 до N максимальное значение — это N - 1, и длина его двоичной записи показывает минимальное количество бит.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, равно ли оно 126. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.

for n in range(1, 10000):  # Перебираем числа N от 1 до 9999 включительно
    s = bin(n)[2:]  # Перевод в двоичную систему
    if n % 2 == 0:
        # Если n - чётно, дописываем 11, иначе 00
        s += "11"
    else:
        s += "00"
    """
    Результат переводим в десятичную систему и вычитаем
    длину двоичной записи максимального значения (n - 1)
    чисел от 0 до N - 1
    """
    x = int(s, 2) - len(bin(n - 1)[2::])

    if x == 126:  # Сравниваем результат с 126
        print(n)  # Выводим ответ
        break  # Завершаем цикл


Ответ: 32

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

Задача 28#30289Максимум баллов за задание: 1

На вход алгоритма подаётся натуральное число N  . Алгоритм строит по нему новое число R  следующим образом.

  1. Строится двоичная запись числа N  .
  2. К этой записи справа дописывается единица.
  3. Затем справа дописывается бит чётности: 0  , если в двоичном коде полученного числа чётное число единиц, и 1  , если нечётное.
  4. К полученному результату дописывается ещё один бит чётности.

Полученная таким образом запись (в ней на три разряда больше, чем в записи исходного числа N  ) является двоичной записью искомого числа R  . Какое минимальное число R  , большее 212  , может быть получено в результате работы автомата?

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа R необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью функции bin, дописываем единицу. Затем вычисляем количество единиц с помощью метода count. Если это количество чётное, дописываем справа 0, используя конкатенацию строк (оператор +). Если нечётное, дописываем 1. Повторяем те же действия для изменённой двоичной записи, переводим результат в десятичную систему счисления, получаем R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 212 и является ли наименьшим среди полученных. Если условие выполняется, обновляем наименьшее значение R. После завершения цикла выводим минимальное R, которое > 212.

mn = 10 ** 10  # Инициализация переменной для хранения минимального R > 212

for i in range(1, 10000):  # Перебираем числа N от 1 до 9999 включительно
    s = bin(i)[2:]  # Перевод в двоичную систему
    s += ’1’  # Дописываем единицу

    # Вычисляем бит чётности
    if s.count("1") % 2 == 0:
        # Если количество единиц чётно, дописываем 0, иначе - 1
        s += "0"
    else:
        s += "1"

    # Повторяем предыдущий шаг, но уже для изменённой записи
    if s.count("1") % 2 == 0:
        s += "0"
    else:
        s += "1"

    r = int(s, 2)  # Переводим в десятичную систему, получаем R

    # Проверяем, что r > 212, то есть подходит по условию, и меньше текущего минимального
    if r > 212 and r < mn:
        mn = r
print(mn)

Аналитическое решение:

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

Если изначальное число N  имеет чётное количество единиц, то после добавления нуля количество единиц не изменится, а потому на следующем шаге также добавится ноль. Итого к числу допишут два нуля.

Если изначально число N  имеет нечётное количество единиц, то после добавления единицы количество единиц увеличится на 1  , что означает, что количество единиц станет чётным числом, а значит на следующем шаге уже будут добавлять ноль. Итого к числу допишут единицу и ноль.

Значит мы будем проверять только числа, которые кончаются на 100  или 110  .

Могло ли получиться число 213  ? Нет, в двоичной СС оно выглядит как 110101012  , а значит получиться после алгоритма не могло.

Могло ли получиться число 214  ? В двоичной СС оно выглядит как 110101102  . Так что вполне возможно. Если откинем последние три цифры, то у нас останется число 110102  , добавим к нему единицу и получим число 1101012  , у него чётное число единиц, а значит после работы алгоритма к нему дописали бы два нуля, но мы откинули 110  , а значит это не то число, которое нам нужно.

Могло ли получиться число 215  ? Нет, в двоичной СС оно выглядит как 110101112  , а значит получиться после алгоритма не могло.

Могло ли получиться число 216  ? Нет, в двоичной СС оно выглядит как 110110002  , а значит получиться после алгоритма не могло.

Могло ли получиться число 217  ? Нет, в двоичной СС оно выглядит как 110110012  , а значит получиться после алгоритма не могло.

Могло ли получиться число 218  ? Нет, в двоичной СС оно выглядит как 110110102  , а значит получиться после алгоритма не могло.

Могло ли получиться число 219  ? Нет, в двоичной СС оно выглядит как 110110112  , а значит получиться после алгоритма не могло.

Могло ли получиться число 220  ? В двоичной СС оно выглядит как 110111002  . Так что вполне возможно. Если откинем последние три цифры, то у нас останется число 110112  , добавим к нему единицу и получим число 1101112  , у него нечётное число единиц, а значит после работы алгоритма к нему дописали бы единицу и ноль, но мы откинули    100  , а значит это не то число, которое нам нужно.

Могло ли получиться число 221  ? Нет, в двоичной СС оно выглядит как 110111012  , а значит получиться после алгоритма не могло.

Могло ли получиться число 222  ? В двоичной СС оно выглядит как 110111102  . Так что вполне возможно. Если откинем последние три цифры, то у нас останется число 110112  , добавим к нему единицу и получим число 1101112  , у него нечётное число единиц, а значит после работы алгоритма к нему дописали бы единицу и ноль, а мы откинули как раз 110  , значит 222  – это интересующее нас число.

Ответ: 222

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

Задача 29#30290Максимум баллов за задание: 1

На вход алгоритма подаётся натуральное число N  . Алгоритм строит по нему новое число R  следующим образом.

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

Полученная таким образом запись (в ней на три разряда больше, чем в записи исходного числа N  ) является двоичной записью искомого числа R  . Укажите минимальное число N  , после обработки которого автомат получает число, большее 120  . В ответе это число запишите в десятичной системе.

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью функции bin, дописываем последнюю цифру, которая имеет индекс -1 (первая с конца). Затем вычисляем количество единиц изначальной записи с помощью метода count. Если это количество чётное, дописываем справа 0, используя конкатенацию строк (оператор +). Если нечётное, дописываем 1. Повторяем те же действия для изменённой двоичной записи, переводим результат в десятичную систему счисления, получаем R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 120. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.

for n in range(1, 1000):  # Перебираем числа N от 1 до 999 включительно
    r = bin(n)[2:]  # Перевод в двоичную систему
    r += r[-1]  # Дублируем последнюю цифру

    # Вычисляем количество единиц изначальной (!) записи
    if bin(n)[2:].count("1") % 2 == 0:
        # Если количество единиц чётно, дописываем 0, иначе - 1
        r += "0"
    else:
        r += "1"

    # Повторяем предыдущий шаг, но уже для изменённой записи
    if r.count("1") % 2 == 0:
        r += "0"
    else:
        r += "1"

    if int(r, 2) > 120:  # Получаем R
        # Первое выведенное N будет минимальным
        print(n)  # Выводим N
        break  # Завершаем цикл

Ответ: 15

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

Задача 30#30291Максимум баллов за задание: 1

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

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

2) Запись «переворачивается», то есть читается справа налево. Если при этом появляются ведущие нули, они отбрасываются.

3) Полученное число переводится в десятичную запись и выводится на экран. Какое наименьшее число, превышающее 765, после обработки автоматом даёт результат 23?

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью функции bin. Затем переворачиваем строку, используя срез с шагом -1, избавляемся от ведущих нулей, применяя функцию int. Далее снова приводим к строке, чтобы перевести двоичную запись в десятичный вид, используя int.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения проверяем, равняется ли оно 23. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N > 765, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.

for i in range(766, 10000000):  # Перебираем числа N > 765
    s = bin(i)[2:]  # Перевод в двоичную систему
    s = str(int(s[::-1]))  # Переворачиваем двоичную запись (s[::-1]),
    # избавляемся от незначащих нулей (int), приводим к строке (str)
    if int(s, 2) == 23:  # Проверяем, что получили 23
        print(i)  # Выводим N
        break  # Завершаем цикл

Ответ: 928

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

Задача 31#30292Максимум баллов за задание: 1

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

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

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

3) К полученному двоичному числу прибавляют единицу.

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

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

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью функции bin, при чём нас интересует восьмибитная двоичная запись, в ней всегда 8 символов, если меньше - нужно добавить в начало нули (например, 111 -> 00000111). Количество необходимых нулей вычисляется по формуле: 8 - длина двоичной записи. Далее создаём пустую строку, в которой сохраним инвертированное число. Проходимся по каждой цифре двоичной записи, если встретили 1, добавляем в новую строку 0 и наоборот. Единицу удобнее добавить после перевода в десятичную запись, так и сделаем, после чего сравним полученное число с 130 и выведем N, если это так.

for i in range(1, 128):  # Перебор значений N от 1 до 127
    s = "0" * (8 - len(bin(i)[2::])) + bin(i)[2::]
    # Добавляем необходимое количество нулей в начало, чтобы запись имела 8 бит (цифр)

    x = ""  # Строка для хранения инвертированной записи
    for j in range(len(s)):  # Проходимся по каждому индексу
        if s[j] == "1":  # Получаем цифру по индексу j и сравниваем с 1
            # Если встречаем 1, добавляем 0 и наоборот
            x += "0"
        else:
            x += "1"
    if (int(x, 2) + 1) == 130:  # Добавляем единицу и сравниваем с нужным числом
        print(i)  # Выводим ответ


Аналитическое решение:

Необходимо найти такое N  , что после работы алгоритма мы получим 130. Давайте размотаем алгоритм с конца: в конце алгоритм добавляет единицу, а значит отнимём её и получим число 129
   10  . В 2 СС это число выглядит так 100000012  . Инвертируем биты обратно, получим число 011111102  , ведущий ноль не отбрасываем, так как алгоритм строил восьмибитную(то есть состояющую из 8 цифр в двоичной СС) запись. Значит изначальное число равнялось 01111110 = 126
        2     10  .

Ответ: 126

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

Задача 32#30293Максимум баллов за задание: 1

Автомат обрабатывает натуральное число N  (1 ≤ N ≤ 255)  по следующему алгоритму:

  1. Строится восьмибитная двоичная запись числа N  .
  2. Удаляется последняя цифра двоичной записи.
  3. Запись «переворачивается», то есть читается справа налево.
  4. Полученное число переводится в десятичную запись и выводится на экран.

Каково наименьшее число, меньшее 100  , которое после обработки автоматом не изменится?

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью функции bin, при чём нас интересует восьмибитная двоичная запись, в ней всегда 8 символов, если меньше - нужно добавить в начало нули (например, 111 -> 00000111). Количество необходимых нулей вычисляется по формуле: 8 - длина двоичной записи. Далее избавляемся от последней цифры, используя срез, переворачиваем запись при помощи среза с шагом -1. Осталось перевести результат в десятичную систему счисления.

Далее организуем перебор чисел N < 100 в цикле for. Для каждого полученного значения проверяем, равняется ли оно изначальному. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.

for i in range(1, 100):  # Перебор значений N < 100
    s = "0" * (8 - len(bin(i)[2:])) + bin(i)[2:]
    # Добавляем необходимое количество нулей в начало, чтобы запись имела 8 бит (цифр)

    s = s[:len(s) - 1]  # Избавляемся от последней цифры
    s = s[::-1]  # Переворачиваем запись
    if int(s, 2) == i:  # Сравниваем результат с изначальным числом
        print(i)  # Выводим N
        break  # Завершаем цикл, прекращаем поиск

Ответ: 24

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

Задача 33#30294Максимум баллов за задание: 1

Алгоритм получает на вход натуральное число 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

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

Задача 34#30295Максимум баллов за задание: 1

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

  1. Строится двоичная запись числа N  .
  2. В конец записи (справа) дописывается конъюнкция двух правых крайних цифр двоичной записи числа N  .
  3. В конец записи (справа) дописывается конъюнкция двух левых крайних цифр двоичной записи числа N  .
  4. Результат переводится в десятичную систему.

Пример. Дано число N = 23  . Алгоритм работает следующим образом:

  1. Двоичная запись числа N : 10111  .
  2. Конъюнкция двух правых крайних цифр 1  , новая запись 101111  .
  3. Конъюнкция двух левых крайних цифр 0  , новая запись 1011110  .
  4. Результат работы алгоритма R = 94  .

При каком наименьшем числе N  в результате работы алгоритма получится R > 55  ? В ответе запишите это число в десятичной системе счисления.

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа N необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью функции bin. Важно отметить, что s - строка, поэтому нужно перевести в число (тип int), чтобы операция & сработала. Получив результат конъюнкции, приведём его к строке, чтобы дописать в конец, используя конкатенацию (оператор +). Осталось перевести результат в десятичную систему счисления, получив R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 55. Если условие выполняется, выводим N и завершаем цикл, ведь нас интересует наименьшее N, а следующие значения N будут больше, так как цикл перебирает их по возрастанию.

# Перебираем числа N от 2 до 9999 включительно
for n in range(2, 10000):
    s = bin(n)[2:]  # Перевод в двоичную систему
    s += str(int(s[-1]) & int(s[-2]))  # Дописываем конъюнкцию двух последних цифр
    s += str(int(s[0]) & int(s[1]))  # Дописываем конъюнкцию двух первых цифр

    # Переводим R в десятичную систему и проверяем условие R > 55
    if int(s, 2) > 55:
        print(n)  # выводим N
        break  # завершаем цикл

Ответ: 14

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

Задача 35#30296Максимум баллов за задание: 1

На вход алгоритма подаётся натуральное число N  . Алгоритм строит по нему новое число R  следующим образом.

  1. Строится двоичная запись числа N  .
  2. Складываются все цифры двоичной записи, и остаток от деления суммы цифр на 2  дописывается в конец числа (справа). Например, запись 11100  преобразуется в запись 111001  ;
  3. Шаг 2  повторяется еще один раз. Например, запись 111001  преобразуется в запись 1110010  ;

Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N  ) является двоичной записью искомого числа R  .

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

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа R необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью функции bin. Далее заметим, что сумма цифр двоичной записи совпадает с количеством единиц в ней, так как цифр 2, 3 и более нет. Используя метод count, вычисляем сумму цифр, находим остаток от деления на 2 (% 2), дописываем в конец записи с помощью сложения строк. Повторяем то же самое для обновлённой записи. Осталось перевести результат в десятичную систему счисления, получив R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 166 и является ли минимальным среди полученных. Если условие выполняется, обновляем минимальное значение R. После завершения цикла выводим минимальное R, которое смогли найти.

mn = 10 ** 10  # Инициализация переменной для хранения минимального R > 166

for n in range(1, 10000):  # Перебираем числа N от 1 до 9999 включительно
    s = bin(n)[2:]  # Перевод в двоичную систему

    # Считаем количество единиц (сумму цифр) с помощью count,
    # находим остаток (% 2), дописываем в конец s
    s = s + str(s.count("1") % 2)
    s = s + str(s.count("1") % 2)  # Повторяем для обновлённой записи

    r = int(s, 2)  # Переводим в десятичную систему

    # Проверяем, что r > 166, то есть подходит по условию, и меньше минимального
    if r > 166 and r < mn:
        mn = r
print(mn)

Ответ: 170

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

Задача 36#30297Максимум баллов за задание: 1

На вход алгоритма подаётся натуральное число N  . Алгоритм строит по нему новое число R  следующим образом.

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

Полученная таким образом запись (в ней на два разряда больше, чем в записи исходного числа N  ) является двоичной записью искомого числа R  .

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

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа R необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью функции bin. Далее заметим, что сумма цифр двоичной записи совпадает с количеством единиц в ней, так как цифр 2, 3 и более нет. Используя метод count, вычисляем сумму цифр, находим остаток от деления на 2 (% 2), дописываем в конец записи с помощью сложения строк. Повторяем то же самое для обновлённой записи. Осталось перевести результат в десятичную систему счисления, получив R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 50 и является ли минимальным среди полученных. Если условие выполняется, обновляем минимальное значение R. После завершения цикла выводим минимальное R, которое смогли найти.

mn = 10 ** 10  # Инициализация переменной для хранения минимального R > 50

for n in range(1, 10000):  # Перебираем числа N от 1 до 9999 включительно
    s = bin(n)[2:]  # Перевод в двоичную систему

    # Считаем количество единиц (сумму цифр) с помощью count,
    # находим остаток (% 2), дописываем в конец s
    s = s + str(s.count("1") % 2)
    s = s + str(s.count("1") % 2)  # Повторяем для обновлённой записи

    r = int(s, 2)  # Переводим в десятичную систему

    # Проверяем, что r > 50, то есть подходит по условию, и меньше минимального
    if r > 50 and r < mn:
        mn = r
print(mn)

Ответ: 54

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

Задача 37#30298Максимум баллов за задание: 1

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

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

Пример. Дано число N = 13  . Алгоритм работает следующим образом:

  1. Двоичная запись числа N : 1101  .
  2. Сумма цифр двоичной записи 3  , остаток от деления на 2  равен 1  , новая запись 11011  .
  3. Сумма цифр полученной записи 4  , остаток от деления на 2  равен 0  , новая запись 110110  .
  4. На экран выводится число 54  .

Какое наименьшее число, большее 1024  , может появиться на экране в результате работы автомата?

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа R необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью функции bin. Далее заметим, что сумма цифр двоичной записи совпадает с количеством единиц в ней, так как цифр 2, 3 и более нет. Используя метод count, вычисляем сумму цифр (количество единиц), находим остаток от деления на 2 (% 2), дописываем в конец записи с помощью сложения строк. Повторяем то же самое для обновлённой записи. Осталось перевести результат в десятичную систему счисления, получив R.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, превышает ли оно 1024 и является ли минимальным среди полученных. Если условие выполняется, обновляем минимальное значение R. После завершения цикла выводим минимальное R, которое смогли найти.

mn = 10 ** 10  # Инициализация переменной для хранения минимального R > 1024

for n in range(1, 10000):  # Перебираем числа N от 1 до 9999 включительно
    s = bin(n)[2:]  # Перевод в двоичную систему

    # Считаем количество единиц (сумму цифр) с помощью count,
    # находим остаток (% 2), дописываем в конец s
    s = s + str(s.count("1") % 2)
    s = s + str(s.count("1") % 2)  # Повторяем для обновлённой записи

    r = int(s, 2)  # Переводим в десятичную систему

    # Проверяем, что r > 1024, то есть подходит по условию, и меньше минимального
    if r > 1024 and r < mn:
        mn = r
print(mn)

Ответ: 1026

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

Задача 38#30299Максимум баллов за задание: 1

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

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

2. Складываются все цифры полученной двоичной записи. В конец записи (справа) дописывается остаток от деления полученной суммы на 2  .

3. Предыдущий пункт повторяется для записи с добавленной цифрой.

4. Результат переводится в десятичную систему и выводится на экран.

Пример. Дано число N = 13  . Алгоритм работает следующим образом:

1. Двоичная запись числа N  : 1101  .

2. Сумма цифр двоичной записи 3  , остаток от деления на 2  равен 1  , новая запись 11011  .

3. Сумма цифр полученной записи 4  , остаток от деления на 2  равен 0  , новая запись 110110  .

4. На экран выводится число 54  .

Какое наименьшее число, большее вашего балла на ЕГЭ (100  ), может появится на экране в результате работы автомата?

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

Решение программой
В условии задачи описан алгоритм, для поиска подходящего числа необходимо «перевести» этот алгоритм с естественного языка на язык программирования Python. Первым делом переводим число N в двоичную строку с помощью функции bin. Далее заметим, что сумма цифр двоичной записи совпадает с количеством единиц в ней, так как цифр 2, 3 и более нет. Используя метод count, вычисляем сумму цифр (количество единиц), находим остаток от деления на 2 (% 2), дописываем в конец записи с помощью сложения строк. Повторяем то же самое для обновлённой записи. В завершение переводим результат в десятичную систему счисления.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения проверяем, превышает ли оно 100 и является ли минимальным среди полученных. Если условие выполняется, обновляем наименьшее значение. После завершения цикла выводим минимальный результат работы алгоритма, больший 100.

mn = 10 ** 10  # Инициализация переменной для хранения минимального результата > 100

for n in range(1, 10000):  # Перебираем числа N от 1 до 9999 включительно
    s = bin(n)[2:]  # Перевод в двоичную систему

    # Считаем количество единиц (сумму цифр) с помощью count,
    # находим остаток (% 2), дописываем в конец s
    s = s + str(s.count("1") % 2)
    s = s + str(s.count("1") % 2)  # Повторяем для обновлённой записи

    r = int(s, 2)  # Переводим в десятичную систему

    # Проверяем, что результат > 100, то есть подходит по условию, и меньше минимального
    if r > 100 and r < mn:
        mn = r
print(mn)

Аналитическое решение:

Имеется число N  . Все числа в двоичной записи складываются и добавляется остаток от деления на 2 этой суммы, то есть цифра 0 или 1, значит если сумма чётна, то дописываем 0, иначе 1. Если мы дописали единичку, то количество единиц увеличится на 1, а значит, что после этого сумма будет чётна, и уже в следующем пункте мы допишем нолик. Если мы дописали ноль, то сумма числа не меняется, а значит в следующем пункте мы также допишем нолик. Значит число в 2 СС заканчивается на 00 или 10.

Нам необходимо найти число, большее, чем 100, которое в 2 СС заканчивается на 00 или 10. Будем перебирать с минимального.

Подойдет ли число 10110 = 11001012  ? Нет, оно кончается на 01.

Подойдет ли число 10210 = 11001102  ? Да, так как оно заканчивается на 10. Значит это и есть наш ответ.

Ответ: 102

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

Задача 39#30300Максимум баллов за задание: 1

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

  1. Строится двоичная запись числа N  .
  2. Подсчитывается количество нулей и единиц в полученной записи. Если их количество одинаково, в конец записи добавляется её последняя цифра. В противном случае в конец записи добавляется цифра, которая встречается реже.
  3. Шаг 2  повторяется еще два раза.
  4. Результат переводится в десятичную систему счисления.

При каком наибольшем исходном числе N < 1024  в результате работы алгоритма получается нечетное число, которое делится на 7  ?

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

Решение 1

В этой задаче мы рассматриваем алгоритм, который строит новое число на основе двоичной записи исходного числа N и выполняет последовательное добавление битов в конец строки по определённым правилам. Сначала мы организуем перебор всех чисел N от 1023 вниз до 2 с помощью цикла for i in range(1023, 1, -1). Для каждого числа создаём его двоичную запись с помощью bin(i)[2:]. Здесь функция bin(i) возвращает строку вида ’0b...’, поэтому срез [2:] убирает префикс ’0b’, оставляя только последовательность нулей и единиц, которую сохраняем в переменной s.

Далее мы трижды повторяем шаг добавления нового бита: проверяем количество нулей и единиц в текущей строке s с помощью s.count(’0’) и s.count(’1’). Если количество нулей и единиц одинаково, добавляем в конец строки её последнюю цифру s[-1]. Если количество нулей меньше количества единиц, в конец добавляем ’0’, а если единиц меньше, добавляем ’1’. Для компактности решения используется комбинация логических выражений с умножением строк: s[-1] * (s.count(’0’) == s.count(’1’)) добавляет последнюю цифру при равенстве чисел нулей и единиц, а ’1’ * (s.count(’1’) < s.count(’0’)) + ’0’ * (s.count(’0’) < s.count(’1’)) добавляет реже встречающийся бит. Этот блок повторяется три раза, что реализует требование "Шаг 2 повторяется еще два раза".

После трёх итераций получаем финальную двоичную запись, которую преобразуем в десятичное число с помощью int(s, 2). Проверяем два условия: число должно быть нечётным (% 2 != 0) и делиться на 7 (% 7 == 0). Как только находится первое число, удовлетворяющее обоим условиям (так как мы перебираем числа в порядке убывания, оно будет наибольшим), выводим его с помощью print(i) и прерываем цикл командой break.

# Перебор чисел N от 1023 вниз до 2 включительно
for i in range(1023, 1, -1):
    # Получаем двоичную запись числа без префикса ’0b’
    s = bin(i)[2:]  # str: последовательность нулей и единиц

    # Трижды добавляем бит в конец строки по правилу задачи
    # Если количество нулей и единиц одинаково, добавляем последнюю цифру
    # Иначе добавляем бит, который встречается реже
    s += s[-1] * (s.count(’0’) == s.count(’1’)) + \
         ’1’ * (s.count(’1’) < s.count(’0’)) + \
         ’0’ * (s.count(’0’) < s.count(’1’))

    s += s[-1] * (s.count(’0’) == s.count(’1’)) + \
         ’1’ * (s.count(’1’) < s.count(’0’)) + \
         ’0’ * (s.count(’0’) < s.count(’1’))

    s += s[-1] * (s.count(’0’) == s.count(’1’)) + \
         ’1’ * (s.count(’1’) < s.count(’0’)) + \
         ’0’ * (s.count(’0’) < s.count(’1’))

    # Преобразуем итоговую двоичную запись в десятичное число
    # и проверяем, что число нечётное и делится на 7
    if int(s, 2) % 2 != 0 and int(s, 2) % 7 == 0:
        # Если условия выполнены, выводим наибольшее исходное число
        print(i)
        break

Решение 2

Сначала мы организуем перебор всех чисел N от 1023 до 2 включительно с помощью цикла for i in range(1023, 1, -1). Мы начинаем с 1023, чтобы сразу находить наибольшее подходящее число, и двигаемся вниз. Для каждого числа создаём его двоичную запись с помощью функции bin(i)[2:]. Здесь bin(i) возвращает строку вида ’0b...’, а срез [2:] убирает префикс ’0b’, оставляя только последовательность нулей и единиц. Эта строка сохраняется в переменной s.

Далее мы три раза повторяем шаг модификации строки, как требует условие задачи: считаем количество единиц и нулей в текущей записи с помощью s.count(’1’) и s.count(’0’), а затем находим разницу k = s.count(’1’) - s.count(’0’). Если разница отрицательна (k < 0), это значит, что нулей больше, и в конец строки добавляем ’1’, то есть бит, который встречается реже. Если разница положительна (k > 0), единиц больше, и в конец добавляем ’0’. Если разница равна нулю (k == 0), количество единиц и нулей одинаково, и в конец добавляем последнюю цифру текущей строки s[-1]. Мы выполняем эту операцию три раза, чтобы учесть три шага добавления бита.

После трёх итераций получаем финальную двоичную строку, которую преобразуем в десятичное число с помощью int(s, 2). Проверяем два условия одновременно: число должно быть нечётным (% 2 != 0) и делиться на 7 (% 7 == 0). Поскольку мы перебираем числа сверху вниз, как только находим число, удовлетворяющее обоим условиям, оно будет наибольшим, и мы выводим его с помощью print(i), после чего прерываем цикл командой break.

# Перебор чисел N от 1023 вниз до 2 включительно
for i in range(1023, 1, -1):
    # Получаем двоичную запись числа без префикса ’0b’
    s = bin(i)[2:]  # str: последовательность нулей и единиц

    # Повторяем три раза добавление нового бита по правилу задачи
    for j in range(3):
        # Вычисляем разницу между количеством единиц и нулей
        k = s.count(’1’) - s.count(’0’)

        # Если единиц меньше нулей, добавляем ’1’ в конец
        if k < 0:
            s += ’1’
        # Если единиц больше нулей, добавляем ’0’ в конец
        elif k > 0:
            s += ’0’
        # Если единиц и нулей поровну, добавляем последнюю цифру строки
        else:
            s += s[-1]

    # Преобразуем итоговую двоичную запись в десятичное число
    # и проверяем, что число нечётное и делится на 7
    if int(s, 2) % 2 != 0 and int(s, 2) % 7 == 0:
        # Если условия выполнены, выводим наибольшее исходное число
        print(i)
        break

Ответ: 914

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

Задача 40#33499Максимум баллов за задание: 1

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

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

2) Эта запись изменяется по следующим правилам:

Если сумма цифр в двоичной записи числа четная, то справа дописывается 0  , а первые два левых разряда заменяются на 10  ;

Если сумма цифр в двоичной записи числа нечетная, то справа дописывается 1  , а первые два левых разряда заменяются на 11  ;

Например, запись 11100  преобразуется в 111001  .

Полученная таким образом запись (в ней на один разряд больше, чем в записи исходного числа N  ) является двоичной записью искомого числа R  .

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

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

Решение программой

В условии задачи описан алгоритм, для поска подходящего числа N необходмо «перевести» этот алгоритм с естественного языка на язык программирования Python. Сначала переводим число N в двоичную строку с помощью bin(), затем находим количество единиц в числе с помощью метода count() и проверяем чётность этого количества. Если количество чётное, то к срезу со 2 символа исходной двоичной записи слева приписываем 10, а справа 0, используя конкатенацию строк (оператор +). Если нечётное, то к срезу со 2 символа исходной двоичной записи слева приписываем 11, а справа 1.

Далее организуем перебор чисел N в цикле for. Для каждого полученного значения R проверяем, не превышает ли оно 24 и выводим исходное N. В качестве ответа выбираем наибольшее из подходящих N.

for n in range(2, 24): # Перебор всех чисел N от 2 до 23
    x = bin(n)[2:] # Получаем двоичную запись N (без префикса ’0b’)
    if x.count("1") % 2 == 0: # Если количество единиц четное,
        x = "10" + x[2:] + "0" # Заменяем первые две цифры слева на 10 и справа приписываем 0
    else: # Иначе
        x = "11" + x[2:] + "1" # Заменяем первые две цифры слева на 11 и справа приписываем 1
    if int(x, 2) < 24: # Преобразуем полученную двоичную строку в десятичное число R и проверяем условие
        print(n) # Выводим подходящие N

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