Условие
Решить
предыдущую задачу, если требуется, чтобы число
действий (выполняемых операторов присваивания) было порядка
log
n (то есть не превосходило бы
C log
n для
некоторой константы
C;
log
n — это степень,
в которую нужно возвести 2, чтобы получить
n).
Решение
Внесём некоторые изменения во второе из
предложенных решений
предыдущей задачи:
k := n; b := 1; c:=a;
{a в степени n = b * (c в степени k)}
while k <> 0 do begin
| if k mod 2 = 0 then begin
| | k:= k div 2;
| | c:= c*c;
| end else begin
| | k := k - 1;
| | b := b * c;
| end;
end;
Каждый второй раз (не реже) будет выполняться первый
вариант оператора выбора (если
k нечётно, то после
вычитания единицы становится чётным), так что за два цикла
величина
k уменьшается по крайней мере вдвое.
Источники и прецеденты использования
|
|
|
книга |
|
Автор |
А.Шень |
|
Название |
Программирование: теоремы и задачи |
|
Издательство |
МЦНМО |
|
Издание |
второе |
|
Год издания |
2004 |
|
глава |
|
Номер |
1 |
|
Название |
Переменные, выражения, присваивания |
|
параграф |
|
Номер |
1 |
|
Название |
Задачи без массивов |
|
задача |
|
Номер |
1.1.4 |