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

 

Опре­де­ли­те наи­мень­шее воз­мож­ное зна­че­ние R > 1028, ко­то­рое может по­лу­чить­ся в ре­зуль­та­те ра­бо­ты ал­го­рит­ма.

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

Ре­ше­ние.

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

def F(x):

s = 0

while x != 0:

s += x % 10

x //= 10

return s

 

for n in range(10000):

r=n

k=bin(n)[2:]

for i in range(3):

if F(r) % 2 == 0:

k+='0'

r=int(k,2)

else:

k+='1'

r=int(k,2)

if r>1028:

print(r)

break

 

Ответ: 1035.

 

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

def f(n):

for i in range(3): n = n*2 + sum(map(int,str(n)))%2

return n

print(min(f(n) for n in range(1000) if f(n)>1028))

 

При­ве­дем ре­ше­ние Лилии Са­ли­мул­ли­но­вой на языке Python.

for n in range(1,200):

r = bin(n)[2:]

r = r+str(sum(map(int,str(int(r,2))))%2)

r = r+str(sum(map(int,str(int(r,2))))%2)

r = r+str(sum(map(int,str(int(r,2))))%2)

r = int(r,2)

if r > 1028:

print(r)

break

 

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

def F(n):

suma=0

while n>0:

suma+=n%10

n//=10

return suma

a = []

for n in range(1,5000):

s = bin(n)[2:]

s = s + str(F(int(s,2))%2)

s = s + str(F(int(s, 2)) % 2)

s = s + str(F(int(s, 2)) % 2)

if int(s,2)>1028:

a.append(int(s,2))

print(min(a))


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