nextupprevious
Next:2.4.4 Площадь треугольника Up:2.4 Построение линейных программ
Previous:2.4.2 Симметричная буква


2.4.3 Возведение в степень

Задача. Для заданного вещественного X$Х$ вычислить X$Х^{13}$.

Решение. Следующий программный участок строит, очевидно, требуемое решение 

$Read(X);WriteLn(X* X* X* X* X* X* X* X* X* X* X* X* X)$
и выполняет 12 операций умножения. Используя ассоциативность операции умножения, выражение для $X^{13}$ можно записать со следующей расстановкой скобок:

$(X* X)* (X* X)* (X* X)* (X* X) * (X* X) * (X* X)* X$.

Из этой записи ясно, что выражение $X* X$ вычисляется здесь шесть раз (для одного и того же значения $Х$). Мы можем вычислить его один раз, запомнить в новой переменной $Y$, а затем использовать это значение:

$Y := X* X; WriteLn(Y* Y* Y* Y* Y* Y* X)$.

Тот же самый прием можно применить еще раз и получить

$Y := X* X; Z := Y* Y; WriteLn(Z* Z* Z* X)$.

Здесь используется уже всего пять операций умножения. Запоминание результата вычисления выражения $Z* Z$ не даст дальнейшего уменьшения количества операций умножения. Окончательно получаем

module X13;
    var X,Y,Z : Real;
begin
    read(X);
    Y := X$*$X; (*{$ Y = X\uparrow 2 $} *)
    Z := Y$*$Y;  (* {$ Z = Y\uparrow 2 = X\uparrow 4$} *)
    writeln(X,'$\uparrow$ 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,'$\uparrow$13=', Степ13(Х))
end X13А.

Поскольку все использованные здесь определяемые функции имеют нерекурсивные определения и вызываются ровно по одному разу, целесообразно раскрыть все встречающиеся вызовы, и получить тем самым еще один вариант решения:

module X13Б;
    var X : real;
begin
    read(X);
    writeln(X,$'\uparrow 13='$, Sqr(Sqr(Sqr(X)$*$X))$*$ X)
end X13Б.

Next:2.4.4 Площадь треугольника Up:2.4 Построение линейных программ
Previous:2.4.2 Симметричная буква



© В.Н. Касьянов, Е.В.Касьянова, 2004