Решение. Следующий программный участок строит, очевидно, требуемое решение
и выполняет 12 операций умножения. Используя ассоциативность операции
умножения, выражение для
можно записать со следующей расстановкой скобок:
.
Из этой записи ясно, что выражение вычисляется здесь шесть раз (для одного и того же значения ). Мы можем вычислить его один раз, запомнить в новой переменной , а затем использовать это значение:
.
Тот же самый прием можно применить еще раз и получить
.
Здесь используется уже всего пять операций умножения. Запоминание результата вычисления выражения не даст дальнейшего уменьшения количества операций умножения. Окончательно получаем
module X13;
var X,Y,Z : Real;
begin
read(X);
Y := XX;
(*{}
*)
Z := YY;
(* {}
*)
writeln(X,'
13= ', Z
Z
Z
X)
end X13.
Другое решение (с использованием определяемых функций) основано на следующих простых определениях:
На языке Zonnon это запишется так:
module X13А;
var X : real;
procedure Степ3(Х:real) : real;
begin return Sqr(X)
X end Степ3;
procedure Степ6 (X:real):real;
begin return Sqr(Степ3(Х))
end
Степ6;
procedure Степ13 (X:real):real;
begin return Sqr(Степ6(Х))
X end Степ13;
begin
read(X);
writeln(X,'13=',
Степ13(Х))
end X13А.
Поскольку все использованные здесь определяемые функции имеют нерекурсивные определения и вызываются ровно по одному разу, целесообразно раскрыть все встречающиеся вызовы, и получить тем самым еще один вариант решения:
module X13Б;
var X : real;
begin
read(X);
writeln(X,,
Sqr(Sqr(Sqr(X)X))
X)
end X13Б.
Next:2.4.4
Площадь треугольника Up:2.4
Построение линейных программ
Previous:2.4.2
Симметричная буква