快速幂

对于快速幂,比较好理解;

就简单介绍一下a^b,如果单纯的用for循环需要b次

但是用快速幂就只需眼看b的二进制数;

 

代码如下:

int poww(int a, int b) {
    int ans = 1, base = a;
    while (b != 0) {
        if (b & 1 != 0)
            ans *= base;
            base *= base;
            b >>= 1;
    }
    return ans;
}

 

代码很短,死记也可行,但最好还是理解一下吧,其实也很好理解,

以b==11为例,b=>1011,二进制从右向左算,

但乘出来的顺序是 a^(2^0)*a^(2^1)*a^(2^3),

是从左向右的。我们不断的让base*=base目的即是累乘,以便随时对ans做出贡献。

  其中要理解base*=base这一步:

因为 base*base==base2,

下一步再乘,就是base2*base2==base4,

然后同理  base4*base4=base8,

由此可以做到base-->base2-->base4-->base8-->base16-->base32.......指数正是 2^i ,

再看上面的例子,a¹¹= a1*a2*a8,这三项就可以完美解决了,快速幂就是这样。

  顺便啰嗦一句,由于指数函数是爆炸增长的函数,所以很有可能会爆掉int的范围,根据题意选择 long long还是mod某个数自己看着办。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值