Задание №5 — Анализ простейших алгоритмов
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1) Строится двоичная запись числа N.
2) Далее если исходное число чётное, то справа к построенной двоичной записи числа N приписывается 0, если нечётное, то приписывается 1.
3) Далее полученная на втором шаге алгоритма запись обрабатывается по следующему правилу:
а) если количество единиц в двоичной записи кратно трём, то в этой записи два левых разряда заменяются на 11;
б) если количество единиц в двоичной записи некратно трём, то в этой записи два левых разряда заменяются на 10.
Полученная таким образом запись является двоичной записью искомого числа R.
Например, для исходного числа 610 = 1102 результатом является число 10002 = 810, а для исходного числа 310 = 112 результатом является число 1112 = 710.
Укажите максимальное число N, после обработки которого с помощью этого алгоритма получается число R, не большее, чем 37. В ответе запишите это число в десятичной системе счисления.
Правильный ответ
25
Пояснение
Решение:
Разберёмся, что делает алгоритм. К двоичной записи справа приписывается её последняя цифра: 0 для чётного , 1 для нечётного. Затем два левых разряда заменяются на 11, если количество единиц кратно трём, и на 10 в противном случае.
Длина записи на один разряд больше длины записи , а старший разряд остаётся единицей.
Так как — шестиразрядное число, у не может быть больше шести разрядов, значит у их не больше пяти и . Кроме того, шестиразрядное число, начинающееся с 11, не меньше , поэтому левые разряды обязаны замениться на 10.
Перебираем от 31 вниз:
| после шага 2 | единиц | ||
|---|---|---|---|
| 31 | 111111 | 6 (кратно 3) | |
| 30 | 111100 | 4 | |
| 29 | 111011 | 5 | |
| 28 | 111000 | 3 (кратно 3) | |
| 27 | 110111 | 5 | |
| 26 | 110100 | 3 (кратно 3) | |
| 25 | 110011 | 4 |
Первое сверху значение, при котором , — это .
def alg(n):
b = bin(n)[2:] + str(n % 2)
b = ('11' if b.count('1') % 3 == 0 else '10') + b[2:]
return int(b, 2)
print(max(n for n in range(1, 1000) if alg(n) <= 37))
Ответ: 25