实现 x 的 n 次幂,要求复杂度:O(logn)
首先循环相乘是不可能的了,第一想法是二分法,我们还要考虑,幂数是否为负,为负的话可以转换位正数幂:
2^-2=(1/2)^2;
二分法可以有两种写法,第一种是递归代码如下:
private double Power(double x, int n)
{
long i = n;
if (i < 0)
{
i = -i; //这个涉及到int类型范围问题,int类型范围为:-2,147,483,648 到 2,147,483,647
x = 1 / x; //long 可以扩大范围避免 n = -2,147,483,648时,-n超过int范围
}
if (i == 0)
return 1;
if (i == 1)
return x;
int k = (int)(i % 2);
double temp = Power(x, (int)(i / 2));
if (k == 0)
return temp * temp;
return temp * temp * x;
}
第二种非递归:
private double Power2(double x, int n)
{
double res = 1;
if (n < 0)
{
n = -n - 1; //这个涉及到int类型范围问题,-1避免超出int范围
x = 1 / x;
res *= x; //上面(n = -n - 1),导致最后结果会少乘一次,这里补上
}
while (n != 0)
{
if (n % 2 == 1) //任意整数连续➗2得到的结果都是1
res *= x;
x *= x;
n /= 2;
}
return res;
}