拿到题目之后,首先进行分析。这里的幂可以是正数也可以是负数。负数需要取个倒数。
明白之后,开始写代码
超时解法
public double myPow(double x, int n) {
double res = 1.0;
//正数和负数分别进行判断
if(n>0) {
for (int i = 1; i <= n; i++)
res *= x;
}
else if(n<0){
int positive = Math.abs(n);
for (int i = 1; i <= positive; i++)
res *= x;
res=1.0/res;
}
return res;
}
提交上去后,报超时错误。对于幂非常大的数会报错。
需要进行优化
优化解法
如果指数为32,上面的做法会做31次。但是我们发现可以在16的平方的基础上再平方一次即可。而16的平方又可以由8的平方得到。所以可以递归的去做。
public double myPow(double x, int n) {
double res = 1.0;
if(x==1.0) return 1.0;
//调用得到结果 进行分析
res = power(x,Math.abs(n));
if(n<0)
res = 1.0/res;
return res;
}
public double power(double base,int exponent){
//终止条件
if(exponent==0) return 1;
if(exponent==1) return base;
//二分之幂来得到result 移位用>>>
double result = power(base,exponent>>>1);
//结果进行平方
result*=result;
//偶数多乘个base
if ((exponent&1)==1)
result*=base;
return result;
}