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

Ал­го­ритм вы­чис­ле­ния зна­че­ния функ­ции F(n), где n  — целое не­от­ри­ца­тель­ное число, задан сле­ду­ю­щи­ми со­от­но­ше­ни­я­ми:

F(0)  =  0;

F(n)  =  F(n / 2), если n > 0 и при этом чётно;

F(n)  =  1 + F(n − 1), если n нечётно.

 

Сколь­ко су­ще­ству­ет таких чисел n, что 1 ≤ n ≤ 1000 и F(n)  =  3?

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

Ре­ше­ние.

При­ведём ана­ли­ти­че­ское ре­ше­ние Ро­ма­на Ре­ше­ти­ло­ва :

До­ка­жем, что F(n) - это ко­ли­че­ство еди­ниц в дво­ич­ной за­пи­си числа n. По усло­вию, F(0) = 0. F(1) = 1 + F(0) = 1. Пред­по­ло­жим, что утвер­жде­ние верно для лю­бо­го k-знач­но­го в дво­ич­ной за­пи­си числа с дво­ич­ной за­пи­сью A. Тогда F(A0) = F(A), F(A1) = 1 + F(A). Утвер­жде­ние до­ка­за­но.

В про­ме­жут­ке от 1 до 1023 вклю­чи­тель­но чисел, у ко­то­рых в точ­но­сти три еди­ни­цы в дво­ич­ной за­пи­си, С(3, 10) = 10!/(3!*7!)=120 (число со­че­та­ний).

Среди чисел от 1001 до 1023 ни одно не со­дер­жит в точ­но­сти три еди­ни­цы в дво­ич­ной за­пи­си. Дей­стви­тель­но, 24 < 25, по­это­му каж­дое такое число в дво­ич­ном виде на­чи­на­ет­ся по край­ней мере с пяти еди­ниц.

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

k = 0

for n in range(1, 1001):

if bin(n).count('1') == 3:

k += 1

print(k)

 

 

При­ведём про­грам­му на PascalABC, ре­ша­ю­щую дан­ную за­да­чу:

var n: longint;

i, count: integer;

function F(n: longint): longint;

begin

if n = 0

then F := 0

else if (((n mod 2) = 0) and (n > 0))

then F := F(n div 2)

else if ((n mod 2) <> 0)

then F := 1 + F(n - 1);

end;

begin

count := 0;

for i := 1 to 1000 do

if F(i) = 3 then count := count + 1;

writeln(count);

end.

Ре­зуль­тат ра­бо­ты про­грам­мы  — 120.

 

Ответ: 120.

 

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

def f(n):

if n == 0:

return 0

if n > 0 and n % 2 == 0:

return f(n / 2)

if n % 2 != 0:

return 1 + f(n - 1)

k = 0

for n in range(1, 1001):

if f(n) == 3:

k += 1

print(k)

 

При­ведём ре­ше­ние Вик­то­рии Зи­бе­ро­вой на языке Python.

f = [0]*1001

for n in range(1,1001):

if n==0:

f[n]=0

if n>0 and n%2==0:

f[n]=f[n//2]

if n%2!=0:

f[n]=1+f[n-1]

print(sum([1 for i in f if i==3]))

Раздел кодификатора ФИПИ: 1.5.3 Ин­дук­тив­ное опре­де­ле­ние объ­ек­тов