Предположение
OP хочет двоичный код дополнения до двух. Целые числа
Python уже используют дополнение до двух, но, поскольку они имеют произвольную точность, двоичное представление отрицательных чисел будет иметь бесконечную строку 1 в начале, так же, как положительные числа имеют бесконечная строка 0 с. Поскольку это, очевидно, не может быть показано, вместо этого оно обозначается знаком минус. ссылка
Это приводит к:
>>> bin(-5)
'-0b101'
Таким образом, чтобы устранить эффект бесконечной точности, мы можем показать дополнение 2 к фиксированному числу битов. Используйте здесь 16, поскольку в OP упоминаются числа <10 000. </p>
>>> bin(-5 % (1<<16)) # Modulo 2^16
>> bin(-5 & 0b1111111111111111) # 16-bit mask
'0b1111111111111011'
Пример использования дополнения 2
Код теста
result = []
for line in ['+3', '-3', '-25', '+35', '+1000', '-20000', '+10000']:
n = int(line)
xs = bin(n & 0b1111111111111011) # number in 16-bit 2's complement
runs = maxConsecutive(xs)
print(f"line: {line}, n: {n}, 2's complement: {xs}, max ones run: {runs}")
result.append(runs)
print(f'Max run is {max(result)}')
Тестовый выход
line: +3, n: 3, 2's complement binary: 0b11, max ones run: 2
line: -3, n: -3, 2's complement binary: 0b1111111111111101, max ones run: 14
line: -25, n: -25, 2's complement binary: 0b1111111111100111, max ones run: 11
line: +35, n: 35, 2's complement binary: 0b100011, max ones run: 2
line: +1000, n: 1000, 2's complement binary: 0b1111101000, max ones run: 5
line: -20000, n: -20000, 2's complement binary: 0b1011000111100000, max ones run: 4
line: +10000, n: 10000, 2's complement binary: 0b10011100010000, max ones run: 3
Max run is 14
Код
def maxConsecutive(input):
return max(map(len,input[2:].split('0'))) # Skip 0b at beginning of each
def max_len(input_file):
max_len_ = 0
with open(input_file) as file:
first_line = file.readline()
if not first_line:
return 0
k = int(first_line.strip()) # number of tests
for i in range(k):
line = file.readline().strip()
n = int(line)
xs = bin(n & '0b1111111111111011') # number in 16-bit 2's complement
n = maxConsecutive(xs)
if n > max_len_:
max_len_ = n
return max_len_
Упрощение кода из max_len
max_len может быть уменьшено до:
def max_len(input_file):
with open(input_file) as file:
return max(maxConsecutive(bin(int(next(file).strip()), 0b1111111111111011)) for _ in range(int(next(file))))