剑指Offer刷题笔记(java实现)_16.数值的整数次方

题目很简单,我们要求出一个数值的整数次方

思路:最简单的就是通过一个循环,每次循环乘上一个底数,最后就得到了我们想要的结果

但是这样的方法并不高效率,我们之前学习过斐波那契数列,和这个有些类似

我们发现一个数的16次方就等于8次方乘8次方,8次方有等于4次方*4次方。我们会发现这样的计算方法高效很多。

既然是一个大问题向下分解,分解为多个小问题, 那么我们就是使用递归

注意:如果我们接受一个指数为负数的数值,那么我们要先当做正数处理,处理结束后求它的倒数,那么这样计算有个问题,如果底数为0,求他的倒数将会出现错误,因此这种特殊情况需要处理

package numberpower;

public class NumPowTest {
    public static void main(String[] args) {
     System.out.println(fib(2,-2)) ;
    }

    public static double fib(double base, int exponent){
        int absExponent=Math.abs(exponent);
           if (base==0&&exponent<0){
               try {
                   throw new Exception("输入的数值不合法");
               } catch (Exception e) {
                   e.printStackTrace();
                   System.out.println(e.getMessage());
                   System.exit(1); ;;
               }
           }

           if (absExponent==1){//递归结束条件
               return base;
           }

           double result=fib(base,absExponent>>1);
           result=result*result;

           if ((absExponent&1)==1){//如果是奇数
               result*=base;//再乘a
           }

           if (exponent<0)//如果指数是负数,则取倒数
               result=1/result;
        return result;
    }
}

我们递归处也要分情况

如果指数为奇数或者偶数也要分情况处理

猜你喜欢

转载自blog.csdn.net/Sunmeok/article/details/82949844