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

Ал­го­ритм по­лу­ча­ет на вход на­ту­раль­ное число N и стро­ит по нему новое число R сле­ду­ю­щим об­ра­зом:

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

2.  Под­счи­ты­ва­ет­ся ко­ли­че­ство чётных и нечётных цифр в де­ся­тич­ной за­пи­си за­дан­но­го числа. Если в де­ся­тич­ной за­пи­си боль­ше чётных цифр, то в конец дво­ич­ной за­пи­си до­пи­сы­ва­ет­ся 1, если нечётных  — 0. Если чётных и нечётных цифр в де­ся­тич­ной за­пи­си по­ров­ну, то в конец дво­ич­ной за­пи­си до­пи­сы­ва­ет­ся 0, если дан­ное число чётное, и 1  — если нечётное.

3−4.  Пункт 2 по­вто­ря­ет­ся для вновь по­лу­чен­ных чисел ещё два раза.

5.  Ре­зуль­та­том ра­бо­ты ал­го­рит­ма ста­но­вит­ся де­ся­тич­ная за­пись по­лу­чен­но­го числа R.

 

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

1.  Стро­им дво­ич­ную за­пись: 1410  =  11102.

2.  В за­пи­си числа 14 чётных и нечётных цифр по­ров­ну. Число 14 чётное, до­пи­сы­ва­ем к дво­ич­ной за­пи­си 0, по­лу­ча­ем 111002  =  2810.

3.  В за­пи­си числа 28 чётных цифр боль­ше нечётных, до­пи­сы­ва­ем к дво­ич­ной за­пи­си 1, по­лу­ча­ем 1110012  =  5710.

4.  В за­пи­си числа 57 нечётных цифр боль­ше, до­пи­сы­ва­ем к дво­ич­ной за­пи­си 0, по­лу­ча­ем 11100102  =  11410.

5.  Ре­зуль­тат ра­бо­ты ал­го­рит­ма R  =  114.

 

Опре­де­ли­те ко­ли­че­ство при­над­ле­жа­щих от­рез­ку [876 544; 1 234 567 899] чисел, ко­то­рые могут по­лу­чить­ся в ре­зуль­та­те ра­бо­ты этого ал­го­рит­ма.

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

Ре­ше­ние.

 

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

o1 = 0

o2 = 0

q1 = bin(876544)[2:]

q2 = int(q1[:len(q1)-3], 2)

for n in range(q2 - 10, q2 + 10):

s = bin(n)[2:]

for i in range(3):

count1 = 0

count2 = 0

l = int(s, 2)

l1 = l

while l > 0:

if (l % 10) % 2 == 0:

count2 += 1

l //= 10

elif (l % 10) % 2 != 0:

count1 += 1

l //= 10

if count2 > count1:

s += '1'

elif count2 < count1:

s += '0'

elif count1 == count2:

if l1 % 2 == 0:

s += '0'

else:

s += '1'

r = int(s, 2)

if 876544 <= r and r <= 1234567899:

o1 = n

break

k1 = bin(1234567899)[2:]

k2 = int(k1[:len(k1) - 3], 2)

for n in range(k2 - 10, k2 + 10):

s = bin(n)[2:]

for i in range(3):

count1 = 0

count2 = 0

l = int(s, 2)

l1 = l

while l > 0:

if (l % 10) % 2 == 0:

count2 += 1

l //= 10

elif (l % 10) % 2 != 0:

count1 += 1

l //= 10

if count2 > count1:

s += '1'

elif count2 < count1:

s += '0'

elif count1 == count2:

if l1 % 2 == 0:

s += '0'

else:

s += '1'

r = int(s, 2)

if 876544 <= r and r <= 1234567899:

o2 = n

print(o2 - o1 + 1)

 

Ответ: 154211420.

 

 

При­ведём ре­ше­ние Юли Мур­та­зи­ной на языке Python.

def alg(n):

for u in range (3):

res = [int(x) for a,x in enumerate(str(n))]

sen, sans = 0, 0

for i in res:

if i % 2 == 0:

sen += 1

else:

sans += 1

n = n * 2 + 1 if (sen > sans or (sen == sans and n % 2 == 1)) else n * 2

return n

a,b = 876544, 1234567899

n1 = a // 8-5

while alg(n1) < a:

n1 += 1

n2 = b // 8-5

while alg(n2) <= b:

n2 += 1

print(n2 - n1)


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