Алгоритм получает на вход натуральное число N и строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N без ведущих нулей.
2. Подсчитывается количество единиц и количество нулей в полученной двоичной записи. Эти числа переводятся в двоичную систему и записываются друг за другом без использования ведущих нулей: сначала количество единиц, затем количество нулей.
3. Результатом работы алгоритма становится десятичная запись полученного числа R.
Пример. Дано число N = 17. Алгоритм работает следующим образом.
1. Строим двоичную запись: 1710 = 100012.
2. В полученном двоичном числе две единицы и три нуля. Переводим в двоичную систему: 210 = 102, 310 = 112. Записываем подряд: 1011.
3. Переводим в десятичную систему: 10112 = 1110. Результат работы алгоритма R = 11.
Определите минимальное число N, для которого результатом работы данного алгоритма будет R = 183.
Приведём решение на языке Python.
cislo = bin(183)[2:]
one, zero, otv = [], [] , []
for i in range(len(cislo) - 1):
if cislo[i + 1] != '0':
one.append(int(cislo[:i + 1], 2))
zero.append(int(cislo[i+1:], 2))
for j in range(len(one)):
otv.append(int('1' + '0' * int(zero[j]) + '1'*int(one[j]-1),2))
print(min(otv))
Ответ: 134217743.
Приведём решение Бориса Савельева на языке Python.
s = bin(183)[2:]
a = []
for i in range (1,len(s)):
s1=''
s2=''
for k in range (0,i):
s1+=s[k]
for k in range (i,len(s)):
s2+=s[k]
if s2[0]!='0':
m1=int(s1,2)
m2=int(s2,2)
s3='1'+'0'*m2+'1'*(m1-1)
a.append(int(s3,2))
print(min(a))

