目录
代码
class Solution {
public:
double myPow(double x, int n) {
/*------------不需要计算的情况------------*/
if(x==0)return 0;
if(x==1||n==0)return 1;
if(x==-1)return n%2==0?1:-1;
/*------------将底数和指数取绝对值,其正负性对结果的影响放在最后讨论------------*/
/*------------乘总比除好算------------*/
double X=abs(x),a=1;
int N=abs(n);
/*------------二分法进行快速计算------------*/
while(N!=0){
if(X>1000000000000000&&n<0)
return 0;//根据规定,单精度小于10^6,双精度小于10^15时判定为0
if(N%2==1)a*=X;
X*=X;
N/=2;
}
//讨论底数与指数的正负性对结果的影响
if(n<0)a=1/a;
if(x<0&&n%2!=0)return -a;
else return a;
}
};
二分法
关于幂次的快速计算,一次次乘效率太差。二分法是一个比较理想的快速计算算法的选择。
令:····································································(1)
其中,为正实数,
为正整数。对
进行分解可得:
··························································(2)
易知为自然数,
为1或0
将(2)代入(1)得:
再对做同样分解可得:
依此类推,即为二分法的过程。本质上就是根据n的二进制各位上的值,将结果乘以x对应次幂。