Pow(x, n)---lintcode

来源:互联网 发布:mysql 合计函数 编辑:程序博客网 时间:2024/06/10 04:53

Description

Implement pow(x, n).

Example

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

这个题目很简单。for循环。挨个乘。就行。于是

public double myPow(double x, int n) {        // Write your code here        double result=1;       for(int i=0;i<Math.abs(n);i++){           result*=x;       }        if(n<0){            result=(double)1/result;        }        return result;    }

但是测试时间有点长啊!
这里写图片描述

于是弱弱的我 百度其他方法,找到两个方法,都是分治法。一个是递归 一个是非递归,用了二进制。
递归 二分法来加速计算x^n=x^(n/2)* x^(n/2)即x^10=x^5*x^5,这种计算N次幂只要相乘O(logN)次,但是会有重复计算

public double myPow(double x, int n) {        if(n==0) return 1;        if(n==1)return x;        if(n==-1)  return (double)1/x;        int temp=n;        n=Math.abs(n);        double result=1;        if(n%2==1){            result=myPow(x,n/2)*myPow(x,n/2)*x;        }else{             result=myPow(x,n/2)*myPow(x,n/2);        }        if(temp<0){            result=(double)1/result;        }        return result;}

这个测试时间好一点
这里写图片描述

非递归(利用二进制,这个方法有点难啊):
参考网址:http://blog.csdn.net/morewindows/article/details/7174143
我就直接搬他的解释吧。

考虑x^23,可以先从x ->x^2 -> x^4 -> x^8 -> x^16 取result1 = x^16,然后23-16=7。

我们只要计算x^7再与result1相乘就可以得到x^23。对于x^7也可以采用这种方法

取result2 = x^4,然后7-4=3,只要计算x^3再与result2相乘就可以得到x^7。由此可以将x^23写成x^16 * x^4* x^2 * x,即23=16+4+2+1,而23 = 10111(二进制),所以只要将n化为二进制并由低位到高位依次判断如果第i位为1,则result *=x^(2^i)。

还可以作进一步的优化,如像48=110000(二进制)这种低位有很多0的数,可以先过滤掉低位的0再进行计算,这样也会提高一些效率

public double myPow(double x, int n) { int temp=n;        n=Math.abs(n);        if(n==0) return 1;        else{            while((n & 1)==0){                n>>=1;                x*=x;            }        }        double result=x;        n >>=1;        while(n!=0){            x*=x;            if((n & 1)!=0){                result*=x;            }            n >>=1;        }        if(temp<0){            return (double)1/result;        }        return result;}

测试:这里写图片描述