Pow(x, n)

来源:互联网 发布:七骑士亚服充值淘宝 编辑:程序博客网 时间:2024/05/23 02:01

1.题目

实现 pow(x,n)   不用担心精度,当答案和标准输出差绝对值小于1e-3时都算正确

Pow(2.1, 3) = 9.261Pow(0, 1) = 0Pow(1, 0) = 1

2.算法

这道题属于数值计算的题目,方法和Divide Two Integers相似,就是把n看成是以2为基的位构成的,因此每一位是对应x的一个幂数,然后迭代直到n到最高位。比如说第一位对应x,第二位对应x*x,第三位对应x^4,...,第k位对应x^(2^(k-1)),可以看出后面一位对应的数等于前面一位对应数的平方,所以可以进行迭代。因为迭代次数等于n的位数,所以算法的时间复杂度是O(logn),数值计算的题要经常处理越界条件,本题也是,越界处理如下

1.当n为复数时,要对x求导,所以x不能过小,所以要检测x

2 我们要把n取绝对值,这样好算,所以取绝对值之前要检测n是否为Integer.MIN_VALUE

3 由于幂乘运算可能会很大,在下次循环成之前,要检测越界

    public double myPow(double x, int n)     {        // Write your code here        if (n == 0)         {            return 1.0;        }        double res = 1.0;        if (n < 0)        {            // 当n为复数时,要对x求导,所以x不能过小,所以要检测x            if (x > 1 / Double.MAX_VALUE || x < - 1 / Double.MAX_VALUE)            {                x = 1 / x;            }            else             {                return Double.MAX_VALUE;            }            // 我们要把n取绝对值,这样好算,所以取绝对值之前要检测n是否为Integer.MIN_VALUE            if (n == Integer.MIN_VALUE)            {                res *= x;                n++;            }        }        boolean isNeg = false;        n = Math.abs(n);        // 判断最后结果正负,如果奇数个负值相乘,结果为负        if (n % 2 == 1 && x < 0)        {            isNeg = true;        }        x = Math.abs(x);        while (n > 0)        {            if ((n & 1) == 1)            {  // 由于幂乘运算可能会很大,在下次循环成之前,要检测越界                if (res > Double.MAX_VALUE / x)                {                    return Double.MAX_VALUE;                }                res *= x;            }            x *= x;            n = n >> 1;        }        return isNeg ? -res : res;    }


0 0
原创粉丝点击