


5 задание ЕГЭ по информатике
В общем, я почекал гайды на ютубе, но на сайте решу егэ совсем не так, половину условий не понимаю решите пожалуйста с помощью питона:
Автомат обрабатывает натуральное число N по следующему алгоритму.
1. Строится двоичная запись числа N.
2. Удаляется первая слева единица и все следующие непосредственно за ней нули. Если после этого в числе не остаётся цифр, результат этого действия считается равным нулю.
3. Полученное число переводится в десятичную запись.
4. Новое число вычитается из исходного, полученная разность выводится на экран.
Сколько разных значений будет показано на экране автомата при последовательном вводе всех натуральных чисел от 10 до 1000?
И желательно с объяснением каждого условия пожалуйста хочу сам научится его уже решать
def f(n):
b=bin(n)[2:]
i=b.find('1')
if i<0:return n
s=b[i:]
z=0
for k in range(1,len(s)):
if s[k]=='0':z=k
else:break
if s[0]=='1':
if z==0:s=s[1:]
else:s=s[z+1:]
if not s:s='0'
return n-int(s,2)
r=set()
for i in range(10,1001):r.add(f(i))
print(len(r))
def f(n):: Определяет функцию f, принимающую число n.
b=bin(n)[2:]: b = двоичное представление n (без “0b”).
i=b.find('1'): Находит индекс первой единицы.
if i<0:return n: Если единицы нет, возвращает n.
s=b[i:]: s = часть строки b с первой ‘1’ до конца.
z=0: z - индекс первого нуля после первой ‘1’ (изначально 0).
for k in range(1,len(s)):: Цикл по строке s.
if s[k]=='0':z=k else:break: Если символ ‘0’, z = его индекс, иначе выход из цикла.
if s[0]=='1':: Если первый символ - единица:
if z==0:s=s[1:] else:s=s[z+1:]: Если z равно 0, убирает первую ‘1’, иначе убирает ‘1’ и все нули после нее.
if not s:s='0': Если строка пустая, приравнивает к ‘0’.
return n-int(s,2): Возвращает n - результат перевода s в десятичное число.
r=set(): Создает пустое множество r.
for i in range(10,1001):r.add(f(i)): Вызывает f для чисел 10-1000 и добавляет результаты в r.
print(len(r)): Выводит размер r (количество уникальных значений).
Числа от 0 до 767 (0b1011111111) включительно дадут 256 чисел от 0 до 255 включительно. И то, что отсчёт идёт от 10, на результат не повлияет.
Числа от 768 (0b1100000000) до 1000 включительно дадут ещё (1000 - 768 + 1) чисел от 256 и далее.
Ответ: 256 + (1000 - 768 + 1).
Но если хочешь кодом, то:
import re
s = set()
for i in range(10, 1001):
s.add(int(re.sub(r'^10*', '', bin(i)[2:]) or '0', 2))
print(len(s))