对于一个数求幂,我们有下面的公式
当n为偶数,
当n为奇数,
这里的除法是c++里面的整数除法。
快速幂的代码:
float power(const float x, const int k){
float result = 1, base = x;
int p = (k > 0) ? k : -k;
while(p){
if(p & 1) result *= base;
base *= base;
p = (p >> 1);
}
return (k < 0) ? 1 / result :
(k > 0) ? result : 1;
}
一开始看这个代码,想不明白为什么指数幂倒着除,而底数正着往上乘。想了半天,最后搜维基百科发现快速幂的另一个写法:
当n为偶数
当n为奇数
也就是说,当前的幂底下,result要乘上一个当前的底数,然后更新当前的底数为.
最后,由于所有的数最后除法都会到1或者-1,所以最后的值会乘一个当前的底数base,最后跳出循环输出。
这里,result就是记录奇数情况下,多出来的那个底数,base就是不断地更新平方后的底数。