实现pow(x,n)函数

在这里插入图片描述

本题不能使用for循环然后相乘,会超时。本题使用了快速幂法。
  利用二进制与十进制转化的方法,把n拆开。

在这里插入图片描述
简单来说就是,n每次右移一位,x每次与自身相乘,当n的最右边为1时,res = res * x;

如x^10用上述方法计算:
	10的二进制是1010   记录结果res = 1
	1、1010右边为0,所以不进行计算,然后1010右移变为101,x = x*x,变为x的平方
	2、101最右为1,计算 res = res * x; 即res = x的平方,101右移为10,x = x*x ,此时x为初始x的4次方
	3、10最右为0,不计算,右移变为1,x = x*x;x为初始值的8次方
	4、1最右为1,计算res = res * x;即res = x的平方 * x的8次方, 1右移为0, x = x * x
	5、结束
从上述的步骤来看,就是把x的10次方变为x的8次方和x的平方相乘
每次循环都更新x的值为x的平方,x依次为1次方2次方4次方8次方16次方.....当n最右侧为1时,再记录此时与x的乘积。 
  public double myPow(double x, int n) {
        if(x==0) return 0;
        long b = n;
        double res = 1;
        if(b<0){
            x = 1/x;
            b = -b;
        }
        while(b>0){
            if((b&1)==1) res *= x;
            x *= x;
            b >>= 1;
        }
        return res;
    }

Java 代码中 int32 变量 n∈[−2147483648,2147483647] ,因此当 n = -2147483648时执行 n = -n , 会因越界而赋值出错。解决方法是先将 n 存入 long 变量 b ,后面用 b 操作即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值