目录
一、题目
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入:x = 2.00000, n = 10 输出:1024.00000
二、思路
一开始,我以为这是一个非常简单的问题,直接写了个for循环然后Wrong Answer...
之后通过快速幂的方法解决了这个题目
什么是快速幂呢?
就是逐渐去缩短求幂次数的过程,比如我要求3的10次幂,那么可以指数折半,基数翻倍,就变成求9的5次幂了。再比如说,我要求3的11次幂,那么我可以先将11分成1和10,那么result = 3*3^10,而3^10又可以像上面那样对半分,变成9^5...
循环次数大大减少,对于更大的数那就更不必说了。
关于快速幂的实现:(只是实现思想)
//假设基数是base,指数是n
while(n>0){
if(n&1==1){
//它是奇数
result = result*base;
}
n = n>>1;
base = base*base;
}
三、代码实现
非递归:
public static double myPow(double x, int n) {
if(x==0){
return 0;
}
if(n<0){
x=1/x;
n=-n;
}
double result = 1.0;
long num = n;
while(num>0){
//n&1是位运算,按位比较两个数二进制码的数值,如果都是1,那么结果中对应位置也为1
//如果是偶数,那么二进制码最后一位一定是0,所以和1与一定是0
if((num&1)!=0){
//如果是奇数,就把指数-1,然后给结果乘上一个基数
result = result * x;
}
num = num>>1;
x = x*x;
}
return result;
}
递归:
public static double myPow2(double x, int n){
if(x==0){
return 0;
}
//由于int的二进制中负数和正数最后一位不一样,用long来接收n值进行位操作
long num = n;
if(n<0){
x=1/x;
num=-num;
}
return getPow(x,num);
}
public static double getPow(double x,long n){
if(n==0){
return 1;
}
if((n&1)!=0){
return x*getPow(x*x,n>>1);
}
return getPow(x*x,n>>1);
}
四、两种方法的效果(leetcode给的参考)
1、非递归
2、递归
可以看到,两种实现方法还是有一定差别的。