【剑指offer第2版-第17题-JAVA】

数值的整数次方

题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

Math.pow函数可以达到要求,但题目明确要求不能使用库函数。
最简单的解法-一个循环,遍历exponent次,base不断的乘自己。注意考虑临界情况:负数,0,上代码。

//最简单的循环,不断相乘
    public static double myPower(double base,int exponent){
        // 临界情况 -0的负数次方
        if(base == 0 && exponent <0){
            return 0;
        }
        // 临界情况-负数先取正值
        int absExponent = exponent;
        if(exponent<0){
            absExponent=-exponent;
        }
        double ans = 1;
        for(int i = 0;i<absExponent;i++){
            ans = ans*base;
        }
        // 临界情况-结果集需要取倒数
        if(exponent<0){
            ans=1/ans;
        }
        return ans;
    }

其实上面遍历过程中,有些重复的计算,如果输入的指数为32时,则上面的函数需要做31次乘法,但我们可以换一种思路考虑:我们的目标是32次方,当我们已知base的16次方,那么只要在16次方的基础上再平方一次就可以了,而16次方是8次方的平方,这样以此类推,求32次方只需要做5次乘法,base2–>(base2)2–>(base4)2–>(base8)2–>(base16)2。如果是奇数,按照上面的步骤求完平方,再多乘一次自己。上代码。

 public static double myPowerSquare(double base, int exponent) {
        // 临界情况 -0的负数次方
        if (base == 0 && exponent < 0) {
            return 0;
        }
        // 临界情况-负数先取正值
        int absExponent = exponent;
        if (exponent < 0) {
            absExponent = -exponent;
        }
        //递归过程中,指数为0,返回1
        if(absExponent==0){
            return 1;
        }
        //递归过程中,指数为1,返回base自己
        if(absExponent==1){
            return base;
        }
        //从上而下,不断递归,求平方
        double ans = myPowerSquare(base, absExponent >> 1);
        //自己乘自己,求平方
        ans *= ans;
        //判断是否是奇数,乘base自己
        if((absExponent & 1)== 1){
            ans *=base;
        }
        // 临界情况-结果集需要取倒数
        if (exponent < 0) {
            ans = 1 / ans;
        }
        return ans;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值