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

Ис­пол­ни­тель пре­об­ра­зу­ет число на экра­не. У ис­пол­ни­те­ля есть три ко­ман­ды, ко­то­рым при­сво­е­ны но­ме­ра:

1.  При­ба­вить 1.

2.  При­ба­вить 2.

3.  Умно­жить на 2.

Пер­вая ко­ман­да уве­ли­чи­ва­ет число на экра­не на 1, вто­рая уве­ли­чи­ва­ет его на 2, тре­тья умно­жа­ет на 2.

Про­грам­ма для ис­пол­ни­те­ля  — это по­сле­до­ва­тель­ность ко­манд. Сколь­ко су­ще­ству­ет про­грамм, ко­то­рые пре­об­ра­зу­ют ис­ход­ное число 1 в число 11 и при этом не со­дер­жат двух ко­манд умно­же­ния под­ряд?

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

Ре­ше­ние.

Решим за­да­чу с по­мо­щью языка про­грам­ми­ро­ва­ния PascalABC. На­пи­шем ре­кур­сив­ную функ­цию, под­счи­ты­ва­ю­щую не­об­хо­ди­мое ко­ли­че­ство про­грамм. Учтём, что в про­грам­ме не долж­но по­вто­рять­ся две ко­ман­ды умно­же­ния под­ряд. Для этого введём бу­ле­вую пе­ре­мен­ную multiplied. При­ведём код ре­ше­ния:

function F(x, y: integer; multiplied: boolean): integer;

begin

if x = y

then F := 1

else if x > y

then F := 0

else if multiplied = False

then F := F(x + 1, y, False) + F(x + 2, y, False) + F(x * 2, y, True)

else if multiplied = True

then F := F(x + 1, y, False) + F(x + 2, y, False);

end;

begin

writeln(F(1, 11, False));

end.

Таким об­ра­зом, ко­ли­че­ство про­грамм, удо­вле­тво­ря­ю­щих усло­вию за­да­чи и вы­ве­ден­ное на экран, равно 213.

 

Ответ: 213.

 

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

def f(x, y, Flag):

if x > y:

return 0

if x == y:

return 1

elif Flag:

return f(x + 1, y, True) + f(x + 2, y, True) + f(x * 2, y, False)

else:

return f(x + 1, y, True) + f(x + 2, y, True)

print(f(1, 11, True))


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