50. Pow(x, n)
程序员文章站
2022-07-15 12:47:45
...
问题
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
例子
思路
-
方法1 O(n)
暴力法 超时
将多个相乘 -
方法2 O(logn)
代码
//循环法
public double myPow(double x, int n) {
//因为n可能无法由负的变成正的,如:Integer.MIN_VALUE的负数还是负数
long nn = n;
//改变x,和n
if(nn<0) {
x=1/x;
nn=-nn;
}
double res=1.0;
while(nn>0){
if(nn%2==1){
res*=x;
nn--;
}else{
x=x*x;
nn/=2;
}
}
return res;
}
//递归1
public double myPow(double x, int n) {
//因为n可能无法由负的变成正的,如:Integer.MIN_VALUE的负数还是负数
long nn = n;
//改变x,和n
if(nn<0) {
x=1/x;
nn=-nn;
}
return get(x,nn);
}
//递归2
private double res=1.0;
public double myPow(double x, int n) {
//因为n可能无法由负的变成正的,如:Integer.MIN_VALUE的负数还是负数
long nn = n;
//改变x,和n
if(nn<0) {
x=1/x;
nn=-nn;
}
get(x,nn);
return res;
}
public void get(double x, long nn){
//因为可能为nn可能为0
if(nn==0) {
res*=1;
return;
}
if(nn%2==1) {
res*=x;
get(x,nn-1);
}
else{
get(x*xnn/2);
}
}
//最厉害
public double myPow(double x, int n) {
if(n==0) return 1;
if(n==1) return x;
if(n==-1) return 1/x;
double half = myPow(x, n/2);
//n%2可能为-1 和1
double rest = myPow(x, n%2);
return rest*half*half;
}
上一篇: 50. Pow(x, n)
下一篇: 50. Pow(x, n)