关于快速幂
下面的图来自于K神
简而言之求n的二进制,如果当前位(n&1)为1,那么就可以相乘,否则x不断乘以本身,x^2, x^4, x^8…直到n二进制某位为1,就可以进行相乘。
class Solution {
public:
double myPow(double x, int n) {
if(n==0 || x==1) return 1;
if(n==1) return x;
// 题目给出的n的范围很大,为防止溢出,将其变为long
long b = n;
if(b<0){
b = -b;
x = 1.0/x;
}
// 快速幂求 x^n
double res = 1.0;
while(b){
// b&1 代表当前位(最低位)是否为1
// b>>1 代表其有右移1位
// cout << "b " << b << ", x " << x << endl;
if(b&1) res *= x;
b >>= 1;
x*=x; // x, x^2, x^4,..... 只要b&1为真,就将其乘入到res
}
return res;
}
};