leetcod Pow(x, n)

时间:2022-07-18 14:52:25

题目:就是实现一个指数函数。

直接用一个while一直乘以n词肯定是会超时的。

自己写了用递归(而且是很挫的递归),测试了无数次,根据每个case去修改代码。终于可以AC了。不忍直视,自己写了好长,如下:

class Solution {
public:
double pow(double x, int n) {
int flag1 = , flag2 = ;
if (n < )
{
flag1 = ;
if (n > INT_MIN) n = -n;
else
{flag2 = ; n = -(n + );}
}
if (n == || x == )
return ;
if (x == )
return ;
int time = (int) (log(n)/log());
double ans = x;
int cnt = ;
while(time--)
{
cnt <<= ;
ans *= ans;
}
if(!flag2)
{
if (cnt == n)
{
if(flag1)
return /ans;
return ans;
}
else
{
if (flag1)
return /(ans*pow(x, n - cnt));
return ans*pow(x, n - cnt);
}
}
else
{
if (cnt == n)
{
if (flag1)
return /(ans*x);
return ans*x;
}
else
{
if (flag1)
return /(x*ans*pow(x, n-cnt));
return x*ans*pow(x, n - cnt);
}
}
}
};

然后肯定要看看其他大神。用递归的,别人十几行就搞定了。

double pow(double x, int n) {
if (n == ) return 1.0;
double half = pow(x, n/);
if (n% == )
{
return half*half;
}
else if (n>)
{
return half*half*x;
}
else
{
return half/x*half;
}
}

以下有一个没有用递归的。

public double pow(double x, int n) {
if(n==)
return 1.0;
double res = 1.0;
if(n<)
{
if(x>=1.0/Double.MAX_VALUE||x<=1.0/-Double.MAX_VALUE)
x = 1.0/x;
else
return Double.MAX_VALUE;
if(n==Integer.MIN_VALUE)
{
res *= x;
n++;
}
}
n = Math.abs(n);
boolean isNeg = false;
if(n%== && x<)
{
isNeg = true;
}
x = Math.abs(x);
while(n>)
{
if((n&) == )
{
if(res>Double.MAX_VALUE/x)
return Double.MAX_VALUE;
res *= x;
}
x *= x;
n = n>>;
}
return isNeg?-res:res;
}