C语言解决快速幂的问题

本博文源于C语言求解快速幂的问题,快速幂是一种基于二分法的思想,常称为二分幂,快速幂基于以上事实:

  1. 如果b是奇数,那么有 a b = a ∗ a b − 1 a^b=a*a^{b-1} ab=aab1
  2. 如果b是偶数,那么有 a b = a b / 2 ∗ a b / 2 a^b=a^{b/2}*a^{b/2} ab=ab/2ab/2

举个例子,如果需要求 2 10 2^{10} 210

  1. 对于 2 10 2^{10} 210来说,由于幂次10为偶数,因此需要先求 2 5 2^{5} 25,然后有 2 10 2^{10} 210= 2 5 ∗ 2 5 2^{5}*2^{5} 2525
  2. 对于 2 5 2^{5} 25来说,由于幂次5为偶数,因此需要先求 2 4 2^{4} 24,然后有 2 5 2^{5} 25= 2 ∗ 2 4 2*2^{4} 224
  3. 对于 2 4 2^{4} 24来说,由于幂次4为偶数,因此需要先求 2 2 2^{2} 22,然后有 2 4 2^{4} 24= 2 2 ∗ 2 2 2^{2}*2^{2} 2222
  4. 对于 2 2 2^{2} 22来说,由于幂次2为偶数,因此需要先求 2 1 2^{1} 21,然后有 2 2 2^{2} 22= 2 1 ∗ 2 1 2^{1}*2^{1} 2121
  5. 对于 2 1 2^{1} 21来说,由于幂次1为偶数,因此需要先求 2 0 2^{0} 20,然后有 2 1 2^{1} 21= 2 ∗ 2 0 2*2^{0} 220
  6. 2 0 2^{0} 20=1,然后从下往上依次回退计算即可。
#include<stdio.h>
typedef long long LL;
LL binaryPow(LL a,LL b,LL m){
    if(b==0) return 1;//如果b为0,那么a^0 = 1
    //b为奇数,转化为b-1
    if(b%2==1) return a* binaryPow(a,b-1,m)%m;
    else{
        //b偶数,转化为b/2
        LL mul = binaryPow(a,b/2,m);
        return mul * mul % m;

    }
}
int main()
{
    LL res = binaryPow(2,3,3);
    printf("%ld",res);
    return 0;

}

在这里插入图片描述
也可以将上面的进行位运算,代码就变成这样了。

LL binaryPow(LL a,LL b,LL m){
    LL ans = 1;
    while(b>0){
        if(b&1){
            //如果b的二进制末尾为1,(也可以写成if(b%2))
            ans = ans * a % m;//令ans累计上a
        }
        a = a*a%m;//令a平方
        b>>=1;//将b的二进制右移1位,即b=b>>1或b=b/2;
    }
    return ans;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值