《剑指offer》数值的整数次方 快速幂算法

题目描述

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

思路1 递归+动态规划

代码没有优化,看着有点臃肿= =//,49ms的时间还是有点长,而且复杂度在O(n),显然不是最佳算法,思考快速幂的方法。
这里就分 指数<0 =0 >0三种情况 还有 0^0=1,0^n=0(n>0)

public class Solution {
      public double Power(double base, int exponent) {
        double tem=1.0;
        if(exponent<0)
        { 
            double[] arr=new double[-exponent];
            for(int i=0;i<-exponent;i++)
             {     
                 if(i==0)
                     arr[i]=base;
                 else
                     arr[i]= arr[i-1]*base;
             }
             return 1/arr[-exponent-1];
        }
        else if(exponent==0)
           return 1.0;
        else
             { 
                 double[] arr=new double[exponent];
                    for(int i=0;i<exponent;i++)
                 {     
                     if(i==0)
                         arr[i]=base;
                     else
                         arr[i]= arr[i-1]*base;
                 }
                return arr[exponent-1];
               }
  }
}

思路2 快速幂

快速幂算法是在o( logn )的时间内求得 a ^ b
核心思路:

b & 1 == 1时(b为奇数) a ^ b = ( a ^ ( b / 2 ) ) ^ 2 * a;
b & 1 == 0时(b为奇偶数) a ^ b = ( a ^ ( b / 2 ) ) ^ 2;

ab = (a2)b/2 , b为偶数
ab = (a2)b/2·a , b为奇数
这个公式很简单,原理就是不断的用a的平方来代替b,将b替换为原来的一半。

public class Solution {
      public double Power(double base, int exponent) {
        double temp=1.0;
        int index=0;
        if(exponent>0)
            index=exponent;
        else if(exponent==0)      
            return 1.0;  
        else if(exponent<0)
             if(base==0)
                 throw new RuntimeException("分母不能为0"); 
           else
             index=-exponent;
        while(index!=0) 
        {

            if((index&1)==1)
                temp=temp*base;
            base=base*base;
            //index为101,右移1位为10。
            index >>= 1;
        }
        return exponent>0?temp:1/temp;
  }
}

猜你喜欢

转载自blog.csdn.net/gsch_12/article/details/80835798