5 номер. Преобразование записей чисел
Инверсия двоичных разрядов
(А.Богданов) На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
a) если сумма цифр в двоичной записи числа чётная, то 4 младших бита инвертируются, т.е. 0 изменяется на 1, а 1 на 0;
b) если сумма цифр в двоичной записи числа нечётная, то инвертируются 4 младших бита, за исключением самого младшего разряда
3. Полученная таким образом запись является двоичной записью искомого числа R
Например, для исходного числа 36₁₀ = 100100₂. результатом является число 43₁₀ = 101011₂ а для исходного числа 37₁₀ = 100101₂ результатом является число 59₁₀ = 111011₂
Укажите число N, большее 63, после обработки которого с помощью этого алгоритма получается минимальное число R. В ответе запишите число в десятичной системе счисления.
Подсказка
Сначала выполните все шаги для одного N, сохраняя строку после каждого изменения. Затем уточните, что требуется выбрать: N, R или количество значений.
Решение
Искомая величина: Укажите число N, большее 63, после обработки которого с помощью этого алгоритма получается минимальное число R. В ответе запишите число в десятичной системе счисления.
Разделите решение на два действия: для одного входного числа точно воспроизведите алгоритм, затем отберите результаты по условию задачи. Храните запись числа строкой; основание используемой системы счисления — 2.
В двоичной записи сумма цифр равна числу единиц: её удобно получить как s.count("1"). Остаток этой суммы по модулю 2 — бит чётности; он не равен остатку исходного числа по модулю 2. Чётность самого N определяется последним битом.
Инверсия меняет каждый 0 на 1 и каждый 1 на 0. Меняйте только разряды указанной в условии записи, сохраняя её длину; дополнительные ведущие разряды можно вводить только тогда, когда они явно предусмотрены алгоритмом.
После завершения всех преобразований получите числовой результат: R = int(s, 2). Ограничения на величину R проверяйте численно: лексикографический порядок строк не совпадает с порядком чисел.
Нужно минимизировать выходное R. Собирайте подходящие выходные значения и выбирайте минимум: первое подходящее N не обязательно даёт наименьший R, поскольку разные ветви алгоритма могут менять порядок результатов.
Строгое «больше» означает >, а «не меньше» — >=; аналогично различайте верхние границы. Диапазон перебора определяйте из ограничений и изменения длины записи, а не произвольной константой. Пример из условия помогает проверить отдельный проход алгоритма.
Ответ: 94.