快速求幂

快速幂,即为快速求幂,这个东西理解起来比较简单,例如:

求a^13,可以如下理解:

1.先把13转化成二进制数:13=1101;

2.把二进制数1101转化为十进制数13需要以下运算:13=2^3*1+2^2*1+2^1*0+2^0*1=2^3+2^2+2^0;

3.因此,a^13=a^(2^3+2^2+2^0)=a^(2^3)*a^(2^2)*a^(2^0);

以上结果可以使用位运算来求解,这里以以下一道题为例进行说明:

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

代码如下:

public class Solution {
    public double Power(double base, int exponent) {
        int exp=Math.abs(exponent);
        double res=1;
        while(exp!=0){
            if((exp&1)!=0){
                res*=base;
            }
            base*=base;
            exp=exp>>1;
        }
        if(exponent<0){
            return 1/res;
        }
        else{
            return res;
        }
  }
}

        代码较短,理解起来也不困难,base为底数,exponent为指数,首先我们需要取exponent的绝对值exp,然后令exp与1进行&操作取其二进制数的最后以为,如果是1,则让结果res乘一次base。base操作为该算法的重点,在每次循环中,base都需要乘一次自身再赋值给自己,我们可以这样理解:

假如base为a,base每乘一次自身,相当于第一次相乘:a=a*a=a^2,第二次相乘:a=a*a=a^2*a^2=a^(2^2),第三次相乘:a=a*a=a^(2^2)*a^(2^2)=a^(2^3),根据以上第三步推导出的公式,可以理解为什么了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值