快速幂取模

快速幂取模

    快速幂取模算法用来解决a^b%c的问题。

    当然,该问题可以使用a*b%c=((a%c)*b)%c的公式,进行化简。但是这样子对于只能解决数值比较小的情况,其算法复杂度依旧是O(n)。为了降低时间复杂度,我们可以使用快速幂取模算法,其时间复杂度可以达到O(log n)。

    快速幂取模的本质思想就是:把指数b按二进制展开,从高位到低位依次进行取模运算。其中可以使用递归算法实现,也可以不用递归算法。



    由于各项之间都是2倍的关系,所以我们可以使用递归的思想来实现:


递归方式:

int modexp_recursion(long int a, long int b, long int n)     
{    
    int t = 1;
    if (b == 0)
        return 1;
    if (b == 1)
         return a%n;
    t = modexp_recursion(a, b>>1, n);
    t = t*t % n;
    if (b&0x1)
    {    
        t = t*a % n;
    }
    return t;
 } 

非递归方式:(截取自师兄的代码,那个函数写的漂亮~)

#include<iostream>
using namespace std;
__int64 mod(__int64 a,__int64 b,__int64 c) 
{ 
    __int64 m=1; 
    while(b>=1) 
    { 
        if(b%2==1) 
            m=a*m%c; 
        a=a*a%c; 
        b=b/2; 
    } 
    return m; 
}
int main()
{
    __int64 a,b,c,result;
    while(scanf("%I64d%I64d%I64d",&a,&b,&c)!=EOF)
    {
        if(b==0) printf("%I64d\n",1%c);
        else
        {
            result=mod(a,b,c);
            printf("%I64d\n",result);
        }
    }
    return 0;
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值