最新思路
使用折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘,如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数,对于n是负数的情况,我们可以先用其绝对值计算出一个结果再取其倒数即可。我们让i初始化为n,然后看i是否是2的倍数,是的话x乘以自己,否则res乘以x,i每次循环缩小一半,直到为0停止循环。
最后看n的正负,如果为负,返回其倒数。
class Solution {
public double myPow(double x, int n) {
double res=1.0;
for(int i=n; i!=0; i/=2){
if(i%2!=0){
res*=x;
}
x*=x;
}
return n<0? 1/res:res;
}
}
思路
首先本题可以用循环求解,非常简单,这里不提供了就,不过需要注意负数问题。
本方法思想:如果求10次方用循环做,需要做十次,但是如果我们求5次方的2次方只需要五次即可,9次方=4次方4次方本身,所以这就使得我们想到用递归求解,同时要注意负数和0的问题。
private static double power(double base, int exp) {
// TODO Auto-generated method stub
if (exp == 0) {
return 1;// 假定0的0次方为1
}
if (exp == 1) {
return base;
}
if (exp > 1) {
double result = power(base, exp >> 1);// exp>>1就是exp/2,但是右移效率更高
result = result * result;
if ((exp & 1) == 1) {// exp&1就是判断奇偶,=1为奇数,比%效率更高
result = result * base;
}
return result;
}
if (exp < 0) {
exp = -exp;
double result = power(base, exp);//返回以后就可以按之前的已经写好的正数来了
return 1 / result;eeee }
return -1;
}
总结
- exp>>1就是exp/2,但是右移效率更高
exp&1就是判断奇偶,=1为奇数,比%效率更高