Что ж, 1/3 испытания пройдено. Осталось еще 20 заданий.

На 10-й день мы рассматриваем двоичные числа. Интернет полон материалов, которые вы можете узнать о двоичных числах, поэтому я не буду объяснять их и различные методы преобразования.

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

Опять же, никаких крайних случаев или чисел, пожирающих память.

def binary_representation(n):
# part 1
    binary = 0
    product = n
    multiplier = 1
    while product > 0:
        binary += (product%2)*multiplier
        product //= 2
        multiplier *= 10
    return binary
def longest_sequence(binary):
# part 2
    max_len = 0
    cur_seq = 0
    while True:
        product = binary%10
        if product == 1:
            cur_seq += 1
        else:
            if cur_seq > max_len:
                max_len = cur_seq
                cur_seq = 0
        if binary == 0:
            return max_len
        binary //= 10
return max_len
if __name__ == '__main__':
n = int(input())
binary = binary_representation(n)
max_len = longest_sequence(binary)
print(max_len)

Я разделил свое решение на две части. Преобразование десятичного числа в двоичное и поиск самой длинной последовательности.

В части 1 я использую базовый алгоритм преобразования и просто возвращаю двоичное представление n.

Часть 2 посвящена подсчету самой длинной последовательности единиц.

Алгоритм кажется довольно прямолинейным и простым, но когда я повторил его снова, я понял, что могу сделать оптимизацию! Прямо сейчас я делаю этот цикл While при преобразовании, а затем снова при поиске самой длинной последовательности. Как насчет того, чтобы найти нашу самую длинную последовательность при конвертации?!

Давай попробуем!

версия 2:

Я сделал отдельную логику проверки самой длинной последовательности и использовал ее для повторного использования кода. Но нам нужно сосредоточиться на функции binary_representation. Он больше не возвращает двоичное число, а максимальную длину самой длинной последовательности. На самом деле нам не нужно двоичное представление N.

def is_max_seq(cur_seq, max_seq):
    return cur_seq > max_seq
def binary_representation(n):
    product = n
    cur_seq, max_seq = 0, 0
    while True:
        if product%2 == 1:
            cur_seq += 1
        else:
            if is_max_seq(cur_seq, max_seq):
                max_seq = cur_seq
            cur_seq = 0
        product //= 2
        if product == 0:
            if is_max_seq(cur_seq, max_seq):
                max_seq = cur_seq
            return max_seq
if __name__ == '__main__':
n = int(input())
max_seq = binary_representation(n)
print(max_seq)

Если у вас есть вопрос или предложение, пожалуйста, оставьте комментарий!

Удачного кодирования :)