快速幂

最近一场比赛又把快速幂给忘了,那么就写一次好了

首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照朴素算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多。它的原理如下:
1.
快速幂是可以拆成二进制的
12=2^3 + 2^2==1100(2)
可知公式poww(a,b)=a^b ==a^(b拆成二进制)
那么a^12= =a^(2 ^ 3) * a^(2 ^ 2)= =a^8 * a^4
所以二进制的那一位是1对应2^(n-1)

2.&和>>的妙用

一个数 & 1 的结果就是取二进制的最末位。
还可以判断奇偶x&1== 0为偶,x&1==1为奇。
.>>运算比较单纯,二进制去掉最后一位.
那么根据这个原理可以放出我们的快速幂

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值