剑指 Offer 16. 数值的整数次方 思路和代码

思路:首先,使用循环乘法的方式肯定太慢了。可以使用二分的思路大大缩短运算成本。

        需要考虑x==0,n<0的情况,可以选择递归的方法与循环的方法

递归的方法:

如果一个数的指数是偶数,那么二分的之后,就是两个数相乘。

 如果它的指数是奇数,则两个数相乘后还要乘上x。

class Solution {
    public double myPow(double x, int n) {
//搞一个递归回溯运算更快
// 8 -- 4 4 
// 9 -- 4 4 1
//10 -- 5 5
//11 -- 5 5 1
long b = n;
if(b<0){
  b=-b;
  x=1/x;
}
return poww(x,b);
}
    public double poww(double x,long n){
        if(n==1){
            return x;
        }
        if(n==0){
            return 1;
        }
        double b =poww(x,n>>1);
      return ((n&1)==0)? (b*b) :(b*b*x)  ;  

    }
   
}

循环的方法:更加简单

通过减小指数,增大基数来循环。如指数为奇数,则在res上多乘一个底数。使用二分法,最终指数总会等于1,此时所有的数都乘在了res上。下次二分指数为0,跳出循环输出res。

class Solution {
    public double myPow(double x, int n) {
        if(x == 0) return 0;
        long b = n;
        double res = 1.0;
        if(b < 0) {
            x = 1 / x;
            b = -b;
        }
        while(b > 0) {
            if((b & 1) == 1) res *= x;
            x *= x;
            b >>= 1;
        }
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值