题目
思路
在这题中,n可能很大(指数爆炸),如果就简单采用for循环计算量太大,由于计算量大而时间耗费长。
因此需要降低n,以减少计算量,最常用的算法即快速幂算法。
所谓快速幂,其核心思想是计算2^9时,可以这样计算:
1、计算2*(2*2)*(2*2)*(2*2)*(2*2)
2、计算2*(4*4)*(4*4)
3、计算2*(16)*(16)
4、计算2*(256)
这样做有两个好处,一是不需要乘8次,降低时间复杂度,二是存在很多冗余计算,2x2时只需要计算一次,剩余的乘法都是2x2,即此时已经变成了2x(4)^4,只需要计算一次2x2即可。
快速幂模板
class Solution {
public:
double quickPow(double x, int n) {
double res = 1.0;
int p = n;
if(x==1.0) return 1.0; % 特例,降低计算量
while(p){
if(p&1){ % 若p为奇数,取出一个x暂存在res中,p就是偶数了
res = res * x;
}
x = x*x; % p为偶数时,幂每平方一次,指数除以2
p = p/2;
}
% 任何比1大的数除2除到后面都是1,也就是一定会进奇数的if中,此时更新res即可。
if(n>0){
return res;
}else{
return 1/res; % n为负数时
}
}
};
代码
class Solution {
public:
double myPow(double x, int n) {
double res = 1.0;
long long p = n;
if(x==1.0) return 1.0;
while(p){
if(p&1){
res = res * x;
}
x = x*x;
p = p/2;
}
if(n>0){
return res;
}else{
return 1/res;
}
}
};