求一个数x的n次方,最直接的方法就是循环,代码如下:
double myPow(double x, int n)
{
double ret=x;
if(n==0)
return 1;
if(n>0)
{
for(int i=0;i<n-1;i++)
x*=ret;
}
if(n<0)
{
for(int i=0;i>=n;i--)
x*=1/ret;
}
return x;
}
但是这种方法的时间复杂度是o(n),当n非常大时,时间开销会很大,比如计算1^2115453134154时,会重复很多不必要的操作
参考了其他大佬的代码后,明白了可以用递归降幂的方法来降低时间复杂度,比如计算2^4时,可以化为
(2*2)^2,
也就是说n 为正奇数时,可递归为 x * ( x * x)^ (n / 2)(n为int型,除2向下取整)
n为正偶数时,可递归为(x * x) ^ (n / 2)
n < 0时,转化为n > 0 的情况考虑,即1 / myPow(x, -n)考虑到当n = 2 ^ 31 - 1时-n会溢出,故改为 -(n + 1),再乘上一个x即可。代码如下:
double myPow(double x, int n)
{
if(n == 0)
return 1;
else if(n<0)
return 1/(x*myPow(x,-(n+1)));
else
{
if(n%2==0)
return myPow(x*x,n/2);
else
return x*myPow(x*x,n/2);
}
}
这个函数的时间复杂度为o(log2 n),相比第一个函数时间时间花销小了不少。