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

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

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

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

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

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

 

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

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

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

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

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

 

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

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

Ре­ше­ние.

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

 

Ответ: 6.

 

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

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

 

При­ведём дру­гое ре­ше­ние на языке Python.

a = []

for x in range(100, 3001):

i = int(bin(x)[3:], 2)

if x - i not in a:

a.append(x-i)

print(len(a))


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

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