剑指Offer 11 数值的整数次方

来源:互联网 发布:喝咖啡的利弊 知乎 编辑:程序博客网 时间:2024/04/30 15:26

题目描述

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

思路

如书中所言,我就是那种上来就要写循环的人,完全没有考虑过负数和0;

代码

 static public double Power(double base, int exponent) {        try {            if (base==0.0&&exponent<0) {                throw new  ZeroException("");            }            else if (base==0.0&&exponent>=0)            {                throw  new ZeroException("");            }        }catch (ZeroException e)        {                return 0.000000;        }        if (exponent==0)            return  1.0;        double a = 1.0;        int ex1=0;        if(exponent<0)            ex1= 0-exponent;        else            ex1=exponent;        for (int i = 0 ; i < ex1;i++)        {            a=base*a;        }        if (exponent<0)            return 1/a;        return  a;    }

优化后的

static  public  double Power1(double base ,int exponent)    {        int n=exponent;        exponent=Math.abs(exponent);        if (exponent==0)            return 0;        if (exponent==1)            return base;        double result = Power1(base,exponent>>1);        result*=result;        if ((exponent&1)==1)         result*=base;        return n>0?result:1/result;    }

收获

  1. 用例很重要,看到题最好先想想输入会是什么;
  2. 浮点类型的比较时会出现问题的;因为存在误差,所以应该差值<0.000001之类的就可以了;
  3. & 与运算 乐意完美的观察数字的奇偶,最后一位是1还是0;
0 0