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

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

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

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

Задача 1#24406

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

  1. Строится двоичная запись числа N  .
  2. К этой записи дописываются ещё два разряда по следующему правилу:

    1. cкладываются все цифры двоичной записи числа N  , и остаток от деления суммы на 2  дописывается в конец числа (справа). Например, запись числа 11100  преобразуется в запись 111001  ;
    2. над этой записью производятся те же действия — справа дописывается остаток от деления суммы цифр на 2  .

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

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

 

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

Аналитическое решение:
Заметим, что если число единиц в двоичной записи нечётное, то в первый раз допишется единица, а затем число единиц станет чётным, и во второй раз мы допишем ноль. Если же число единиц в двоичной записи чётное, то в первый раз мы допишем ноль, затем количество единиц не изменится, и мы снова допишем ноль. Таким образом, в любом случае последняя цифра числа — ноль. Напишем программу:

for i in range(1, 100):
    s = bin(i)[2::]
    a = 0
    for j in range(len(s)):
        a += int(s[j])
    if a % 2 == 0:
        s += ’00’
    else:
        s += ’10’
    if int(s, 2) > 43:
        print(int(s, 2))
        break

Ответ: 46

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

Задача 2#25090

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

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

2. К этой записи дописывается единица.

3. Затем справа дописывается бит чётности: 0  , если в двоичном коде полученного числа чётное число единиц, и    1  , если нечётное.

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

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

Показать ответ и решение
for n in range(1, 100):
    s = bin(n)[2:]  # перевод в двоичную систему
    s = str(s)
    s += ’1’
    if s.count(’1’) % 2 == 0:
        s += ’0’
    else:
        s += ’1’
    if s.count(’1’) % 2 == 0:
        s += ’0’
    else:
        s += ’1’
    r = int(s, 2)  # перевод в десятичную систему
    if r > 168:
        print(r)
        break

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

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

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

Подойдет ли число 16910 = 101010012  ? Нет, оно кончается на 001.

Подойдет ли число 170  = 10101010
   10          2  ? Нет, оно кончается на 010.

Подойдет ли число 17110 = 101010112  ? Нет, оно кончается на 011.

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

Ответ: 172

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

Задача 3#25549

Алгоритм получает на вход натуральное число 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 > 198? В ответе запишите это число в десятичной системе счисления.

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

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

При дописывании двух цифр в двоичной записи мы увеличиваем число в 4 раза и прибавляем число от 0 до 3. Логично рассматривать N>=49, так как оно при умножении на 4 может дать число, большее 198. Попробуем на числе 49 заданный алгоритм, получим 197. Значит, ответом будет являться 50, так как 50 при умножении на 4 даст уже 200, что больше, чем 198.

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

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]))
    if int(s, 2) > 198:
        print(n)
        break

Ответ: 50

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

Задача 4#25576

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

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

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

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

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

Показать ответ и решение
for i in range(2, 1000):
    n = bin(i)[2:]
    n = n[:-1] + n[1] * 2
    if int(n, 2) > 92:
        print(i)
        break

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

Давайте перебирать числа R  , большие, чем 92  , мы знаем, что получившееся число должно оканчиваться на две одинаковые цифры и эти цифры должны совпадать со второй цифрой слева.

Подойдёт число 9310 = 1011101  ? Нет, последние две цифры не совпадают.

Подойдёт число 9410 = 1011110  ? Нет, последние две цифры не совпадают.

Подойдёт число 95  = 1011111
  10  ? Возможно, так как последние две цифры совпадают, но вторая цифра слева - ноль, а значит её не могли дописать два раза и получить 95  , значит оно не подходит.

Подойдёт число 9610 = 1100000  ? Возможно, так как последние две цифры совпадают, но вторая цифра слева - единица, а значит её не могли дописать два раза и получить 96  , значит оно не подходит.

Подойдёт число 9710 = 1100001  ? Нет, последние две цифры не совпадают.

Подойдёт число 9810 = 1100010  ? Нет, последние две цифры не совпадают.

Подойдёт число 9910 = 1100011  ? Возможно, так как последние две цифры совпадают, вторая цифра - единица, и число само заканчивается на две единицы, а значит это число могло быть результатом алгоритма. Значит раньше число выглядело так: 11000X  , где вместо икса может быть любая цифра, так как две одинаковые цифры записываются ВМЕСТО последней цифры. Значит минимальным числом будет 1100002 = 4810  .

Ответ: 48

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

Задача 5#25603

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

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

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

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

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

Показать ответ и решение
for n in range(1, 10000):
    r = bin(n)[2:]
    r = r + str(r.count(’1’) % 2)
    r = r + str(r.count(’1’) % 2)
    r = int(r, 2)
    if r > 150:
        print(r)
        break

Ответ: 154

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

Задача 6#25978

На вход алгоритма подаётся натуральное число N  . Алгоритм строит по нему новое число R  следующим образом.
1) Строится двоичная запись числа N  .
2) К этой записи дописываются справа ещё два разряда по следующему правилу:

  • а) складываются все цифры двоичной записи, и остаток от деления суммы на 2  дописывается в конец числа (справа). Например, запись 11100  преобразуется в запись 111001  ;
  • б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы цифр на 2  .

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

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

Показать ответ и решение
for i in range(1, 100000):
    s = bin(i)[2:]
    s += str(s.count(’1’) % 2)
    s += str(s.count(’1’) % 2)
    r = int(s, 2)
    if r > 103:
        print(r)
        break

Ответ: 106

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

Задача 7#26138

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

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

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

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

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

 

Показать ответ и решение
for i in range(4, 100000):
    # от 4, чтобы вторая слева цифра существовала
    s = bin(i)[2:]
    s = list(s)
    s[-1] = s[1]
    s += [s[1]]
    s = ’’.join(s)
    r = int(s, 2)
    if r > 115:
        print(i)
        break

Ответ: 58

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

Задача 8#26165

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

  1. Строится восьмибитная двоичная запись числа N  . 110 = 00000001
  2. Инвертируются разряды исходного числа (0  заменяется на 1  , 1  на 0  ). 11111110
  3. К полученному двоичному числу прибавляют единицу. 11111111
  4. Полученное число переводится в десятичную систему счисления. 255

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

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

Разряды инвертируются, нетрудно заметить, что в двоичной записи сумма восьмибитного числа и его инвертированной версии равна 111111112  . Кроме того, мы знаем, что x+1 = 156. Значит, можем решить систему:

(
{ N + x = 255
(
  x+ 1 = 156

x = 155,N  = 100  .

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

for i in range(1, 128):
    s = ’0’ * (8 - len(bin(i)[2::])) + bin(i)[2::]
    x = ’’
    for j in range(len(s)):
        if s[j] == ’1’:
            x += ’0’
        else:
            x += ’1’
    if (int(x, 2) + 1) == 156:
        print(i)

Ответ: 100

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

Задача 9#26192

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

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

2) К этой записи дописывается (дублируется) последняя цифра.

3) Затем справа дописывается 0  , если в двоичном коде числа N  чётное число единиц, и 1  , если нечётное.

4) К полученному результату справа дописывается ещё один бит чётности так, чтобы количество единиц в двоичной записи полученного числа стало чётным.

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

Показать ответ и решение
for i in range(1000):
    n = i
    s = bin(n)[2:]
    s = s + s[-1]
    s = s + str(s.count(’1’) % 2)
    s = s + str(s.count(’1’) % 2)
    r = int(s, 2)
    if r > 90:
        print(n)
        break

Ответ: 11

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

Задача 10#27248

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

  1. Строится двоичная запись числа N  .
  2. К этой записи дописываются справа ещё два разряда по следующему правилу:

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

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

Показать ответ и решение
for i in range(1, 1000):
    r = bin(i)[2:]
    r += str(r.count(’1’) % 2)
    r += str(r.count(’1’) % 2)
    if int(r, 2) > 1000:
        print(int(r, 2))
        break

Ответ: 1006

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

Задача 11#27249

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

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

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

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

  б) над этой записью производятся те же действия — справа дописывается остаток от деления суммы ее цифр на 2  .

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

Показать ответ и решение
def alg(x):  
    x = bin(x)[2:]  
    #шаг 2а  
    summ = x + str(sum([int(i) for i in x]) % 2)  
    #шаг 2б  
    summ += str(sum([int(i) for i in summ]) % 2)  
    return int(summ, 2)  
for i in range(1, 10000):  
    if alg(i) > 500:  
        print(i)  
        break

Ответ: 126

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

Задача 12#27448

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

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

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

Показать ответ и решение
for i in range(1, 1000):
    n = bin(i)[2:]
    # так как 0 дописывается слева, он незначащий
    n += str((n.count(’0’) % 2 == 0) * 1)
    n += str((n.count(’0’) % 2 == 0) * 1)
    n = int(n, 2)
    if n > 199:
        print(n)
        break

Ответ: 201

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

Задача 13#27672

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

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

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

а) если число чётное, то к двоичной записи числа в конце дописывается 11

б) если число нечётное, то к двоичной записи числа в конце дописывается 01

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

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

Решение №1

Рассмотрим первое максимально возможное число R  , меньшее 128  , а именно 127  . Переведем в двоичную систему счисления и получим 1111111
      2  . Уберём две последние цифры и получим нечетное число, а значит к исходному числу N  должно было добавиться 01  . Значит, число R = 127  не могло получиться в результате работы алгоритма.

Теперь мы сразу можем угадать число R  . У нас есть 111112  , и к нему нужно добавить 012  . Получаем число 11111012 = 125  .

 

Решение №2

ans = 0
for i in range(1000):
    s = bin(i)[2::]
    if i % 2 == 0:
        s += ’11’
    else:
        s += ’01’
    if int(s, 2) < 128:
        ans = max(ans, int(s, 2))
print(ans)

Ответ: 125

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

Задача 14#27987

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

  1. Строится двоичная запись числа N  .
  2. К этой записи дописываются ещё два разряда по следующему правилу:

    1. складываются все цифры двоичной записи, и остаток от деления этой суммы на 2  дописывается в конец числа (справа).
    2. над этой записью производятся те же действия — справа дописывается остаток от деления суммы цифр на 2  .

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

Показать ответ и решение
ans = 0
for i in range(1, 1000):
    s = bin(i)[2:]
    s += str(s.count(’1’) % 2)
    s += str(s.count(’1’) % 2)
    if int(s, 2) < 77 and int(s, 2) > ans:
        ans = int(s, 2)
print(ans)

Ответ: 72

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

Задача 15#30265

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

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

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

а) если число чётное, то к двоичной записи числа в конце дописывается 11

б) если число нечётное, то к двоичной записи числа в конце дописывается 01

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

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

Рассмотрим первое число = 127  . Переведем в двоичную сс и получим 11111112  . Отрубим две последние цифры и получим число нечетное, а значит должно было добавиться 01  . Значит не подходит.

Похоже это число мы сразу можем угадать. У нас есть 11111
     2  и к нему должно добавить 01
  2  . Получаем число 11111012 = 125  . (Число 126  также не подходит т.к. = 11111102  )

Решение №2

ans = 0
for i in range(1000):
    s = bin(i)[2::]
    if i % 2 == 0:
        s += ’11’
    else:
        s += ’01’
    if int(s, 2) < 128:
        ans = max(ans, int(s, 2))
print(ans)

Ответ: 125

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

Задача 16#30266

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

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

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

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

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

Возьмем число 59 = 1110112  . Видим, что вторая слева цифра и последние 2  совпадают, значит обрубаем 2  последние цифры и получаем 1110
    2  , но тут не хватает одной цифры, которую удалили, и наименьшее тут будет являться 0  , поэтому допишем его 111002 = 2810  .

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

for i in range(2, 1000):
    s = bin(i)[2::]
    s = s[:len(s) - 1] + s[1] * 2
    if int(s, 2) > 58:
        print(i)
        break

Ответ: 28

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

Задача 17#30267

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

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

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

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

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

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

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

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

Решение №2

for i in range(2, 1000):
    s = bin(i)[2:]
    s = s[:len(s) - 1] + s[1] * 2
    if int(s, 2) > 177:
        print(i)
        break

Ответ: 90

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

Задача 18#30268

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

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

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

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

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

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

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

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

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

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

Решение №1

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

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

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

Решение №2

for i in range(6, 1000):
    s = bin(i)[2::]
    s = s[:len(s) - 1]
    s += s[1] * 2
    if int(s, 2) > 48:
        print(i)
        break

Ответ: 24

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

Задача 19#30269

Алгоритм получает на вход натуральное число 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  ? В ответе запишите это число в десятичной системе счисления.

Показать ответ и решение
ans = 0
for i in range(2, 1000):
    s = bin(i)[2::]
    x = s
    x += s[1] + s[-2]
    if int(x, 2) < 90:
        ans = i
print(ans)

Ответ: 22

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

Задача 20#30270

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

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

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

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

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

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

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

Показать ответ и решение
for i in range(1, 1000):
    s = bin(i)[2::]
    if s.count(’1’) % 2 == 0:
        s += ’0’
    else:
        s += ’1’
    if s.count(’1’) % 2 == 0:
        s += ’0’
    else:
        s += ’1’
    if int(s, 2) > 78:
        print(i)
        break

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

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

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

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

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

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

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