Задания
Версия для печати и копирования в MS Word
Тип 5 № 17324
i

Ав­то­мат об­ра­ба­ты­ва­ет на­ту­раль­ное число N по сле­ду­ю­ще­му ал­го­рит­му.

1.  Стро­ит­ся дво­ич­ная за­пись числа N.

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

3.  По­лу­чен­ное число пе­ре­во­дит­ся в де­ся­тич­ную за­пись.

4.  Новое число вы­чи­та­ет­ся из ис­ход­но­го, по­лу­чен­ная раз­ность вы­во­дит­ся на экран.

 

При­мер. Дано число N  =  11. Ал­го­ритм ра­бо­та­ет сле­ду­ю­щим об­ра­зом.

1.  Дво­ич­ная за­пись числа N: 1011.

2.  Уда­ля­ет­ся пер­вая еди­ни­ца и сле­ду­ю­щий за ней ноль: 11.

3.  Де­ся­тич­ное зна­че­ние по­лу­чен­но­го числа 3.

4.  На экран вы­во­дит­ся число 11 – 3  =  8.

 

Сколь­ко раз­ных зна­че­ний будет по­ка­за­но на экра­не ав­то­ма­та при по­сле­до­ва­тель­ном вводе всех на­ту­раль­ных чисел от 10 до 1000?

Спрятать решение

Ре­ше­ние.

За­ме­тим, что при уда­ле­нии пер­вой еди­ни­цы и всех сто­я­щих сразу за ней нулей из числа вы­чи­та­ет­ся 2 в сте­пе­ни, рав­ной но­ме­ру стар­ше­го раз­ря­да в дво­ич­ной за­пи­си числа. Зна­чит, нужно найти ко­ли­че­ство сте­пе­ней двой­ки, ко­то­рые на­хо­дят­ся между 10 и 1000. Также не­об­хо­ди­мо учесть, что числа от 10 до 15 будут со­от­вет­ство­вать преды­ду­щей сте­пе­ни двой­ки. Зна­чит, к ко­ли­че­ству сте­пе­ней двой­ки, вхо­дя­щих в диа­па­зон чисел от 10 до 1000, не­об­хо­ди­мо до­ба­вить еди­ни­цу. Всего в диа­па­зо­не от 10 до 1000 шесть сте­пе­ней двой­ки. Сле­до­ва­тель­но, будет по­ка­за­но 6 + 1  =  7 раз­лич­ных чисел.

 

Ответ: 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))

 

При­ме­ча­ние.

За­ме­тим, что число 0 не может яв­лять­ся ре­зуль­та­том ра­бо­ты ал­го­рит­ма. Если на вход по­да­ет­ся число, рав­ное сте­пе­ни двой­ки, то после вы­пол­не­ния шага 2 (уда­ле­ния пер­вой еди­ни­цы из этого числа) по­лу­ча­ет­ся 0. На шаге 4 из ис­ход­но­го числа вы­чи­та­ет­ся 0 и по­лу­ча­ет­ся ис­ход­ное число, рав­ное сте­пе­ни двой­ки.

 

При­ведём ре­ше­ние Ивана Глад­ких на языке 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))


Аналоги к заданию № 17324: 17370 Все

Раздел кодификатора ФИПИ: 1.6.3 По­стро­е­ние ал­го­рит­мов и прак­ти­че­ские вы­чис­ле­ния