Сегодня узнал красивый алгоритм возведения в степень. Образованным людям, наверное, это не интересно, но я поделюсь впечатлениями.
Итак, мы хотим вычислить a^n. Представим n в следующем виде:
n = b[k] * 2^k + b[k-1] * 2^(k-1) + ... + b[0] * 2^0
Тогда:
a^n = a^(b[k] * 2^k + b[k-1] * 2^(k-1) + ... + b[0] * 2^0) =
= a^(b[k] * 2^k) * a^(b[k-1] * 2^(k-1)) * ... * a^(b[0] * 2^0)
На основании чего получаем:
int Pow(int a, int p) {
int res = 1;
for (; p; p >>= 1, a *= a)
if (p & 1)
res *= a;
return res;
}
Комментариев нет:
Отправить комментарий