目录
一、题目
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,x^n)。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入:x = 2.00000, n = 10 输出:1024.00000
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104
二、分析
快速幂思想:
1、每一步将指数n/2,将对应的底数做平方运算,底数再继续将自己的底数的指数再分半......直到n=0。将指数变小、循环次数减少。从而迅速得出底数x的n次幂;
传统的将x乘以n次时间复杂度为O(n),快速幂的时间复杂度为O(log₂N)次,提升了效率;
x^8=(x^4)^2=((x^2)^2)^2,循环次数8——>3
2、既然要将指数除以2,需要考虑指数是奇数还是偶数。若是奇数则需要得到的结果乘一下x,偶数结果x*x。
3、指数n<0时,j将n转为整数的n,将a取倒数,
【a^-n=(a^-1)^n】a != 0
4、n的最小值是:-2147483648,转为正数后大于int类型的最大值,所以当n<0时, 需要long类型的变量来对n进行保存;
三、快速幂代码
class Solution {
public double myPow(double x, int n) {
double res = 1;
// 2147483648 超出int类型的最大值
long y =n;
// 指数小于0,底数取倒数、指数转为正数
if(n<0){
y=-y;
x=1/x;
}
while (y>0){
// 判断是否为奇数
if(y%2 == 1){
res = res * x;
}
x=x*x;
y=y>>1;
}
return res;
}
}
四、递归写法代码
class Solution {
public double myPow(double x, int n) {
// 2147483648 超出int类型的最大值
long y =n;
// 指数小于0,底数取倒数、指数转为正数
if(n<0){
y=-y;
x=1/x;
}
return myPower(x,y);
}
double myPower(double x,long y){
// 递归出口
if(y==0){
return 1;
}
double res = myPower(x,y>>1);
// 指数是否为奇数
if((y%2) == 1){
return res*res*x;
}
return res*res;
}
}
判断n是否为奇数:
n/2==1
n&1==1