我们只要看n的二进制表示,如果是1,就把对应的乘上去。如果不是,那么因子继续跟新。这就是快速幂非递归算法的关键的地方。
理解快速幂的思路是最重要的,就算要记忆结论,也不是去记忆代码怎么写,而是去记忆x的幂次和答案的关系,每一位都要对x做累乘,但只有二进值为1的时候,才乘到代码里面。
typedef long long LL;
class Solution {
public:
double myPow(double x, int n) {
LL N = n;
return (N>=0?_myPow(x,N):_myPow(1/x,-N));
}
double _myPow(double x, long long n){
double res = 1;
while(n){
if(n&1) res*=x;
x*=x;
n>>=1;
}
return res;
}
};