Задания
Версия для печати и копирования в MS Word
Тип 5 № 55592
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.

 

Опре­де­ли­те ко­ли­че­ство при­над­ле­жа­щих от­рез­ку [123 455; 987 654 321] чисел, ко­то­рые могут по­лу­чить­ся в ре­зуль­та­те ра­бо­ты этого ал­го­рит­ма.

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

Ре­ше­ние.

За­ме­тим, что ука­зан­ный ал­го­ритм не ме­ня­ет по­ря­док чисел. Раз­де­лив число 123455 на­це­ло на 2 три раза, по­лу­чим число 15431. Это ми­ни­маль­ное число, из ко­то­ро­го при по­мо­щи ал­го­рит­ма может по­лу­чить­ся число из тре­бу­е­мо­го ин­тер­ва­ла. Но при по­мо­щи ал­го­рит­ма из этого числа по­лу­ча­ет­ся число 123450. Пер­вое число, из ко­то­ро­го по­лу­ча­ет­ся число, при­над­ле­жа­щее ин­тер­ва­лу, это число 15432, ре­зуль­тат ра­бо­ты ал­го­рит­ма 123458. Те­перь по­вто­рим первую опе­ра­цию с по­след­ним чис­лом ин­тер­ва­ла, по­лу­чим число 123456790. При­ме­ним к нему ал­го­ритм, ре­зуль­тат  — число 987 654 325, сле­до­ва­тель­но, по­след­нее число, ко­то­рое нам под­хо­дит,  — 123456789, ре­зуль­тат ра­бо­ты ал­го­рит­ма  — 987654316. Таким об­ра­зом, чисел, из ко­то­рых может по­лу­чить­ся число, по­па­да­ю­щее в нуж­ный от­ре­зок, 123456789 − 15431  =  123441358.

 

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

o1 = 0

o2 = 0

q1 = bin(123455)[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 123455 <= r and r <= 987654321:

o1 = n

break

k1 = bin(987654321)[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 123455 <= r and r <= 987654321:

o2 = n

print(o2 - o1 + 1)

Ответ: 123441358.

 

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

def novoech(pr):

for i in range (0, 3):

n = str(pr)

nechet = n.count('1') + n.count('3') + n.count('5') + n.count('7') + n.count('9')

chet = n.count('0') + n.count('2') + n.count('4') + n.count('6') + n.count('8')

if nechet > chet:

pr = pr*2

elif nechet < chet:

pr = pr*2 + 1

elif nechet ==chet:

if nechet%2 == 0:

pr = pr*2

else:

pr = pr*2 + 1

return pr

minch = 123455//8

for pr in range (minch - 1, minch + 2):

r = novoech(pr)

if r >= 123455:

minch = pr

break

maxch = 987654321//8

for pr in range (maxch - 1, maxch + 2):

r = novoech(pr)

if r <= 987654321:

maxch = pr

print ( maxch - minch + 1 )


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