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

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

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

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

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

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

 

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

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

2.  Сумма цифр числа 17 чётная, до­пи­сы­ва­ем к дво­ич­ной за­пи­си 0, по­лу­ча­ем 1000102  =  3410.

3.  Сумма цифр числа 34 нечётная, до­пи­сы­ва­ем к дво­ич­ной за­пи­си 1, по­лу­ча­ем 10001012  =  6910.

4.  Сумма цифр числа 69  — нечётная, до­пи­сы­ва­ем к дво­ич­ной за­пи­си 1, по­лу­ча­ем 100010112  =  13910.

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

 

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

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

Ре­ше­ние.

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

def summ(n):

sumi=0

while n>0:

sumi+=n%10

n=n//10

return sumi

o1 = 0

o2 = 0

q1 = bin(987654321)[2:]

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

 

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

s = bin(n)[2:]

for i in range(3):

if summ(int(s,2))%2==0:

s += '0'

else:

s += '1'

r = int(s, 2)

if 987654321 <= r and r <= 2123456789:

o1 = n

break

k1 = bin(2123456789)[2:]

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

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

s = bin(n)[2:]

for i in range(3):

if summ(int(s, 2)) % 2 == 0:

s += '0'

else:

s += '1'

r = int(s, 2)

if 987654321 <= r and r <= 2123456789:

o2 = n

print(o2 - o1 + 1)

 

Ответ: 141 975 308.

 

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

def novoech(pr):

for i in range (0, 3):

n = str(pr)

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

if t % 2 == 0:

pr = pr*2

else:

pr = pr*2 + 1

return pr

minch = 987654321//8

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

r = novoech(pr)

if r >= 987654321:

minch = pr

break

maxch = 2123456789//8

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

r = novoech(pr)

if r <= 2123456789:

maxch = pr

print ( maxch - minch + 1 )

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

def algo(n):

for i in range(3):

n = n*2 + sum(map(int,str(n))) % 2

return n

a,b = 987654321,2123456789

n1 = a // 8-5

while algo(n1) < a:

n1 += 1

n2 = b // 8-5

while algo(n2) <= b:

n2 += 1

print(n2 - n1)


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