剑指offer数值的整数次方

  • 不得使用库函数,不必考虑大数问题
    * 虽然不必考虑大数问题,但是,Integer.MIN_VALUE一但取反,就会溢出,所以需要考虑该特殊情况
  • 因为有时间的限制,所以n循环是不可行的,采用二分的方法进行优化,同时考虑到最小值取反会溢出,所以这里采用将一开始的负数n进行/2的操作再进行取反,保证不会溢出,在进行与正数同样的操作。
public double myPow(double x, int n) {
    if(n>0)return Pow(x,n);
   return 1/Pow(x,n);
}
private double Pow(double x,int n){
    if(n==0)return 1;
    if(n==1)return x;
    if(n<0){
        if(n!=0&&(int)(n&1)==0){
            double a = myPow(x,-(n/2));
            return a*a;
        }
        if(n!=0&&(int)(n&1)==1){
            double a = myPow(x,-((n+1)/2));
            return a*a*x;
        }
    }
    if(n!=0&&n%2==0){
        double a = myPow(x,n/2);
        return a*a;
    }
    if(n!=0&&n%2==1){
        double a = myPow(x,(n-1)/2);
        return a*a*x;
    }
    return 0;
}
posted @ 2020-08-25 14:51  珂珂哒  阅读(91)  评论(0)    收藏  举报