Автомат обрабатывает натуральное число N по следующему алгоритму.
1. Строится двоичная запись числа N.
2. Удаляется первая слева единица и все следующие непосредственно за ней нули. Если после этого в числе не остаётся цифр, результат этого действия считается равным нулю.
3. Полученное число переводится в десятичную запись.
4. Новое число вычитается из исходного, полученная разность выводится на экран.
Пример. Дано число N = 11. Алгоритм работает следующим образом.
1. Двоичная запись числа N: 1011.
2. Удаляется первая единица и следующий за ней ноль: 11.
3. Десятичное значение полученного числа 3.
4. На экран выводится число
Сколько разных значений будет показано на экране автомата при последовательном вводе всех натуральных чисел
Заметим, что при удалении первой единицы и всех стоящих сразу за ней нулей из числа вычитается 2 в степени, равной номеру старшего разряда в двоичной записи числа. Значит, нужно найти количество степеней двойки, которые находятся
Ответ: 7.
Приведём решение Юрия Красильникова на языке Python.
print(len(set([n - int(bin(n)[3:],2) for n in range(10,1001)])))
Приведём решение Ильи Молоковича на языке Python.
a = []
for x in range(10, 1001):
i = int(bin(x)[3:], 2)
if x - i not in a:
a.append(x-i)
print(len(a))
Приведём решение Ильи Крылова на языке Python.
l = []
for n in range(10, 1001):
n2 = bin(n)[2:]
n2 = n2[n2.index('1') + 1:]
n2 = n2.lstrip('0')
if n2 == '':
n2 = '0'
n2 = int(n2, 2)
r = n2-n
if(l.count(r)==0):
l.append(r)
print(len(l))
Приведём решение Алексея Третьякова на языке Python.
sp = set()
for n in range(10, 1001):
dv = bin(n)[2:]
first = str(dv).find('1')
second = str(dv).find('1', first + 1)
new_dv = dv[second:]
sp.add(int(dv, 2) - int(new_dv, 2))
print(len(sp))
Примечание.
Заметим, что
Приведём решение Ивана Гладких на языке Python.
c = set()
for n in range(10,1001):
i = str(bin(n)[3:])
z = n - (int(i,2))
c.add(z)
print(len(c))

