经典算法:快速幂 递归与迭代写法

算法数学原理:积的取余等于取余的积的取余。

 

递归:

long long binaryPow(long long a,long long b,long long mode){

    if(b == 0) return 1; //递归出口,分解到指数b等于0
    
    if(b & 1) return a * binaryPow(a, b-1, mode) % mode;//当指数为奇数时 b&1来判断b的二进制最后一位是否是1计算更快一些。
    else{  //b为偶数时
        long long mul = binaryPow(a, b / 2, m);
        return mul * mul % mode;    
    }

}

注意:当b为偶数时不要写成

 return binaryPow(a, b / 2, m) * binaryPow(a, b / 2, m) 

这样的时间复杂度是仍然为O(b):例如求binaryPow(8) = binaryPow(4)+binaryPow(4)=8次binaryPow(1)

而正确写法如else中 时间复杂度为O(logb)

 

 

迭代法:

b可以分解为2^2k + ········+2^3+2^2+2^1+2^0

因此a^b可以进行分解a^2k ,·········,a^8,a^4,a^2,a^1中若干项的乘积。

long long binaryPow(long long a,long long b,long long mode){

    long long ans = 1;

    while(b > 0){
        
        if(b & 1){ // b的二进制末尾是1
            ans = ans * a % mode;
        }
          
        a = a * a % mode;
        b >>= 1;             
    }

    return ans;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值