Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

5 задание ЕГЭ по информатике

В общем, я почекал гайды на ютубе, но на сайте решу егэ совсем не так, половину условий не понимаю решите пожалуйста с помощью питона:
Автомат обрабатывает натуральное число N по следующему алгоритму.

1.  Строится двоичная запись числа N.
2.  Удаляется первая слева единица и все следующие непосредственно за ней нули. Если после этого в числе не остаётся цифр, результат этого действия считается равным нулю.

3.  Полученное число переводится в десятичную запись.
4.  Новое число вычитается из исходного, полученная разность выводится на экран.
Сколько разных значений будет показано на экране автомата при последовательном вводе всех натуральных чисел от 10 до 1000?

И желательно с объяснением каждого условия пожалуйста хочу сам научится его уже решать

По дате
По рейтингу
Аватар пользователя
5мес
123456789101112131415161718
 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 (количество уникальных значений).

Аватар пользователя
Высший разум
5мес

Числа от 0 до 767 (0b1011111111) включительно дадут 256 чисел от 0 до 255 включительно. И то, что отсчёт идёт от 10, на результат не повлияет.

Числа от 768 (0b1100000000) до 1000 включительно дадут ещё (1000 - 768 + 1) чисел от 256 и далее.

Ответ: 256 + (1000 - 768 + 1).

Но если хочешь кодом, то:

12345
 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))