剑指Offer——数值的整数次方

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

思路:

1、首先要分情况讨论。求x^y时,x的大于0,等于0,小于0三种情况;y的大于0,等于0,小于0的三种情况。

      其中当x=0,y<0时返回false,因为分母不能为0;

2、考虑好上面的情况后,求值。

方法一:循环求乘积。

方法一代码:

public double Power(double base, int exponent) {
        double sum=1;
        if(exponent==0)
            return 1.0;
        for(int i=1;i<=Math.abs(exponent);i++){
            sum*=base;
        }
        if(exponent>0){
            return sum;
        }else{
            return 1/sum;
        }
  }

方法二(优化方案):    假设现在exponent=32;

  • 当我们要求一个数字的32次方,就是将16次方再乘16次方;16次方就是将8次方再乘8次方,以此类推......
  • 我们自底向上求结果,就是先平方,再求4次方,再求16次方,以此类推;
  • 由上可得下面的公式

             

             这个公式就是类似于斐波那契数列。

public class Power2 {
    static boolean g_InvalidInput=false;
    public static double power(double base, int exponent) {
        g_InvalidInput=false;
        //非法值的判断
        if(equal(base,0.0)&&exponent<0){
            g_InvalidInput=true;
            return 0.0;
        }
        int absExponent=exponent;
        //如果指数小于0,则取其绝对值
        if(exponent<0){
            absExponent=-exponent;
        }
        double result=powerWithExponent(base,absExponent);
        //如果指数小于0,对结果取倒数
        if(exponent<0)
            result=1.0/result;
        return result;
    }
    public static double powerWithExponent(double base,int exponent){
        if(exponent==0)
            return 1;
        if(exponent==1)
            return base;
        double result=powerWithExponent(base,exponent>>1);
        result*=result;
        if ((exponent&1)==1)
            result*=base;
        return result;
    }


    public static boolean equal(double num1,double num2){
        //判断小数是否有误差的时候不可以直接用==
        if((num1-num2 > -0.0000001)&&(num1-num2)<0.0000001)
            return true;
        else
            return false;
    }


    public static void main(String [] args){
        double base=-5.0;
        int exponent=3;
        double power= power(base,exponent);
        System.out.println(power);

    }
}

注意点:1、小数不能直接使用==来比较是否相等,因为存在误差,所以使用减法,当相减之后再0.000001范围内时,便认为是相等。

2、使用右移运算代替了除以2,用&运算符代替求余数判断奇偶数。效率会极大的提高。

 

细节决定Offer,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值