快速幂算法

概述

快速幂算法,名如其意,就是快速求一个数a的b次幂的算法,常见于竞赛题目、上机笔试题等要求时间的场景。

思路

任何一个整数都可以表示成二进制的形式,比如你想求10的50次方,50的二进制表示为‭110010‬,即50=2^{1}+2^{4}+2^{5},所以10^{50}=10^{2^{1}}*10^{2^{4}}*10^{2^{5}}。我们根据10的1次方可以快速的求出10的2次方(进行相乘即可)。由10的2次方可以快速求出10的4次方,由10的4次方可以快速求出10的8次方.....。所以这种算法就可以极快的算出a的b次幂,对于10的50次方来说,50转化为二进制共有6位,我们只需要做6次乘法运算即可。

假设我们知道10的25次方是多少,再进行一次乘法运算10^{25}*10^{25}就可以了,而10^{25}可以转化为10*10^{24},每次指数级别的下降,从而达到了O(log(N))的时间复杂度了。

通解公式:b为偶数:a^{b}=a^{\frac{b}{2}}*a^{\frac{b}{2}}

                  b为奇数:a^{b}=a*a^{b-1}

由此公式我们便可以写代码了。

代码

/**
* 快速幂算法求解a^b,对M取模。
*/
public long quickPow(long a, long b, long M) {
    if (b == 0) {
        return 1;
    } else if ((b & 1) == 1) {
        return a * quickPow(a, b - 1, M) % M;
    } else {
        // System.out.println("运算了");
        // return quickPow(a, b>>1, M) * quickPow(a, b>>1, M);
        // 防止越界
        long temp = quickPow(a, b >> 1, M) % M;
        return temp * temp % M;
    }
}

总结

遇事多想,大佬的思路确实厉害!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值