剑指Offer_数值的整数次方

题目描述:

            给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

            思路1:最简单的肯定是直接调用API  return Math.pow(base,exponent);,面试官肯定是不会喜欢的;那么可以分类讨论,把base连乘N次,直接求解呢? 这种肯定是可以的,但是这样使用的时间复杂度是O(n);

            思路2:划分思想 要求 base的exponent次幂,那么我们可以这么考虑(这里只考虑正数的情况):

                        情况1:如果exponent是奇数

                                    temp=Math.pow(base,exponent/2);

                                    result=base*temp*temp;

                        情况2:如果exponent是偶数

                                   temp=Math.pow(base,exponent/2);

                                    result=temp*temp;

            这样再加划分的结果乘起来时间复杂度就是O(logN);

程序:递归版

            剑指Offer_数值的整数次方

非递归版:

            剑指Offer_数值的整数次方

Copy:    

public double Power(double base, int exponent) {

        double result=1.0;
        int y=exponent;
        if(exponent<0){
            if(base==0)
                throw new RuntimeException("分母不能为零");
            y=-y;
        }
        else if(exponent==0)
            return 1;
        double harf=Power(base,y>>1);
        result=harf*harf;
        if((y&1)==1){//如果是奇数幂{
            result*=base;
        }
        if(exponent<0)
            result=1/result;
        return result;
    }
    
    
    
    public double Power(double base, int exponent) {
        boolean flag=true;//表示是正数次幂;
        double res=1.0;
        if(exponent<0){
            if(base==0)
                throw new RuntimeException("分母不能为零");
            exponent=-exponent;
            flag=false;
        }
        else if(exponent==0)
            return 1;
        while(exponent!=0){
            if((exponent&1)==1)//如果是base的奇数次幂 ,那么就乘一个base,使幂变成偶数
                res*=base;
            base=base*base;//先求基数的平方
            exponent>>=1;//再把幂/2
        }
        if(flag)
            return  res;
        else
            return 1.0/res;
    }