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

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

package mypack6;

public class Solution {
    //给定一个double类型的浮点数base和int类型的整数exponent,求base的exponent次方

    //思想手段,二分幂
    //也可以采用快速幂
    /*情况
    * 底数为0,指数<0
    *会出现对0求倒数的情况,需要设置一个全局变量
    *判断底数是否等于0,由于底数base为double,所以不能用==判断
    * 优化求幂次数(2分幂)
    *偶:a^n=(a^n/2)*(a^n/2)
    *奇:a^n=a^[(n-1)/2]*a^[(n-1)/2]*a
    * Olog(n)*/
    boolean invalidInput=false;
    //传入
    public double Power(double base,int exponent){
        //如果底数等于0并且指数小于0
        //浮点数为什么不能用==
        /*
        * IEEE754
        * 有误差
        * ==是严格意义上的相等
        * 如何解决
        * 确定一个误差范围  之内相等
        * BigDecimal  其实就是确定一个取舍范围*/

        //判断base是不是0.0相等     底数为0,    指数小于0      计算的时候分母为0
        if(equal(base,0.0)&&exponent<0){
            invalidInput=true;//输入无效
            return 0.0;
        }


        //把输入的指数装在另一个盒子
        int absexponent=exponent;
        //如果指数小于0将指数转正
        if(exponent<0){
            absexponent=-exponent;
        }

        //合格的底数和指数传进去处理
        double res=getPower(base,absexponent);

        if(exponent<0){
            //指数小于0,结果取倒数。
            res=1.0/res;
        }

        return res;
    }



    //判断两个double类型的变量是不是相等
    boolean equal(double num1,double num2){
        if(num1-num2>-0.000001&&num1-num2<0.000001)
            return true;
        else
            return false;
    }






    //求出b的e次方的方法
    double getPower(double b,int e){
        //如果指数为0,返回1
        if(e==0){
            return 1.0;
        }

        //如果指数为1,返回b
        if(e==1)
            return b;
        //上面是两种特殊情况





        //e>>1等于e/2  这里是求a^n=(a^n/2)*(a^n/2)

        //把指数分成两份我们计算
        double result=getPower(b,e>>1);

        //实际上的计算是在这里完成的
        result*=result;
        //如果n为奇数 ,则要再乘一次底数base

        //转换为二进制计算
        //一个整数 n,n&1 这个表达式 可以用来 判断 a的奇偶性。
        //二进制的末位为 0表示偶数,末位为 1表是奇数。
        //使用 n%2 来判断奇偶性 和 n&1 是一样的作用,但是 n&1 要快好多
        if((e&1)==1){
            //奇数的n-1是怎么表示的
            //因为首先判断是不是奇数再这样乘所以不用表示n-1
            result*=b;
        }
        return result;
    }



    public static void main(String[] args) {
        Solution s=new Solution();
        double power = s.Power(3.02, 3);
        System.out.println(power);
    }
}

总结: 转换为二进制计算
一个整数 n,n&1 这个表达式 可以用来 判断 a的奇偶性。
二进制的末位为 0表示偶数,末位为 1表是奇数。
使用 n%2 来判断奇偶性 和 n&1 是一样的作用,但是 n&1 要快好多

    方法2:使用累乘法
package mypack6;

public class test2 {
    //使用累乘法
    public double powerAnother(double base,int exponent){
     double result=1.0;
     
     
     for(int i=0;i<Math.abs(exponent);i++){
         result=result*base;
     }
     
     
     
     if(exponent>=0){
         return result;
     }
     
     
     else {
         return 1/result;
     }
     
     
     
    }

    public static void main(String[] args) {
        test2 e=new test2();
        double v = e.powerAnother(3.02, 3);
        System.out.println(v);
    }
}

总结:O(n)时间复杂度高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值