二分幂(快速幂)递归写法

博客内容介绍了如何使用二分幂(快速幂)算法解决大数乘法问题,避免溢出。在递归实现中,通过判断指数b的奇偶性来拆分计算,递归边界为a0等于1。文章指出,奇数次幂时返回结果必须取模,以防溢出;偶数次幂时,计算中间结果mul需要在mul*mul之前取模,以确保不溢出。此外,博主提到了迭代计算方式,但由于未完全理解,选择只记录递归方法。
摘要由CSDN通过智能技术生成

给出三个正整数a ,b, m, (a < 1e9, b < 1e18, 1< m < 1e9 ) 求a的b次幂 % m

a,b, m都是很大很大的数,以至于正常方法做基本都会溢出
这个时候就可以用二分幂(快速幂),实质是和二分查找是一样一样的,二分查找是通过left 和right 不断缩小范围逼近正确结果,二分幂就是不断拆分ab次幂,直到拆到不能再拆为止,计算出结果,然后利用该结果计算出上一步的结果,这也就是递归的思想了,那么该如何拆分呢?

如果b是奇数,那么有 ab = a * ab-1
如果b是偶数,那么有ab = ab/2 + ab/2
最终结果一定可以拆成 a1 * a0
递归边界就是 a0= 1

上代码

long long binaryPow(int a, int b, int m)
{
    if(b == 0) return 1; //a^0 = 1
    else if( b & 1) // 就是b %2 == 1,不过位运算&效率更高
    {
        return a * binaryPow(a, b - 1, m) % m;
    }
    else
    {
        long long mul = binaryPow(a, b /2, m);
        return mul * mul % m;
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值