Что ж, 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)
Если у вас есть вопрос или предложение, пожалуйста, оставьте комментарий!
Удачного кодирования :)