5 номер. Преобразование записей чисел
Преобразование двоичной записи
Алгоритм получает на вход натуральное число N и строит по нему новое число R следующим образом:
1. Строится двоичная запись числа N.
2. В полученной записи все нули заменяются на единицы, все единицы – на нули. Из полученного числа удаляются ведущие нули.
3. Результат переводится в десятичную систему счисления.
4. Результатом работы алгоритма становится разность исходного числа N и числа, полученного на предыдущем шаге.
Пример. Дано число N = 22. Алгоритм работает следующим образом:
1. Строим двоичную запись: 22₁₀ = 10110₂.
2. Заменяем цифры и удаляем ведущие нули: 10110 → 01001 → 1001.
3. Переводим в десятичную систему: 1001₂ = 9₁₀.
4. Вычисляем разность: 22 – 9 = 13.
Результат работы алгоритма R = 13.
При каком наименьшем N в результате работы алгоритма получится R = 979?
Подсказка
Сначала выполните все шаги для одного N, сохраняя строку после каждого изменения. Затем уточните, что требуется выбрать: N, R или количество значений.
Решение
Разделите решение на два действия: для одного входного числа точно воспроизведите алгоритм, затем отберите результаты по условию задачи. Храните запись числа строкой; основание используемой системы счисления — 2.
При замене разрядов сначала выделите изменяемый фрагмент исходной строки и сохраните остальную часть. Если заменяются одновременно все нули и единицы, стройте новую строку за один проход: две последовательные замены затронут уже изменённые символы.
Удаление разрядов выполняйте срезом строки со стороны, указанной в условии. После удаления числовое значение остатка записи вычисляется заново; ведущие нули не увеличивают это значение.
В шаге с разностью важен порядок операндов. Сохраните исходное число и промежуточные результаты отдельно, чтобы вычитать именно указанные величины, не перезаписав одну из них строковым представлением.
После завершения всех преобразований получите числовой результат: R = int(s, 2). Ограничения на величину R проверяйте численно: лексикографический порядок строк не совпадает с порядком чисел.
Отбирайте ту величину, о которой спрашивается в последнем предложении: исходное число и результат алгоритма нельзя подменять друг другом. Для наименьшего входа рассматривайте допустимые N по возрастанию; для наибольшего проверяйте весь обоснованный диапазон.
Строгое «больше» означает >, а «не меньше» — >=; аналогично различайте верхние границы. Диапазон перебора определяйте из ограничений и изменения длины записи, а не произвольной константой. Пример из условия помогает проверить отдельный проход алгоритма.
Ответ: 1001.