На языке программирования python Двоичный пробел внутри положительного целого числа N представляет собой любую максимальную последовательность последовательных нулей, которая окружена единицами на обоих концах в двоичном представлении N.
Например, номер 9 имеет двоичное представление 1001 и содержит двоичный разрыв длины 2. Число 529 имеет двоичное представление 1000010001 и содержит два двоичных разрыва: один из длины 4 и один из длины 3. Число 20 имеет двоичное представление 10100 и содержит один двоичный разрыв длины 1. Число 15 имеет двоичное представление 1111 и не имеет двоичных разрывов.
Например, при N = 1041 функция должна возвращать 5, потому что N имеет двоичное представление 10000010001, и поэтому его самый длинный двоичный разрыв имеет длину 5.
n = int(input())
current_gap, max_gap = 0, 0
while n % 2 != 1:
n //= 2
while n > 0:
if n % 2 == 0:
current_gap += 1
else:
max_gap = max(current_gap, max_gap)
current_gap = 0
n //= 2
print(max_gap)
Объяснение:
Остаток от деления на 2 — это последняя цифра в двоичной записи числа N. Тогда, каждый раз рассматривая остаток от деления на два и деля нацело это число на 2 (то есть отсекая последнюю цифру), мы получим перевёрнутую двоичную запись N. В ходе такого "переворота" могут образоваться ведущие нули, поэтому мы от них избавимся (делим нацело число на 2, пока не встретим единицу). Далее, если мы видим 0, то увеличиваем на 1 текущее значение пробела; если видим 1, то смотрим, максимально ли получившееся значение, и обнуляем текущее значение пробела. В конце нас всегда ждёт единица, цикл делает последнюю проверку, а затем программа выводит нужное значение.