快速幂取余算法

求a的m次方然后除以t

常规想法是如下

int f=1;
for(int i=1;i<=m;i++){
    f=f*a;
}
f=f%t;

1.容易时间超时,效率低下,快速幂的算法便是提高效率,缩短时间。
2.若a和m较大时容易溢出,若在每次进行次方运算前将所要运算的数取余,则会减少溢出的可能。

运用公式:
(a^m)%t=((a%t)^m)%t 既在每次进行次方运算前(快速幂运算)将所要运算的数取余。

思想和快速幂一样。

#include<stdio.h>

//方法一:递归
int power1(int a,int m,int d){
    int f;
    if(m==0) return 1;
    if(m==1) return a%d;
    else {
        f=power1(a,m>>1,d);
        f=f*f%d;
        if(m&1==1){    //m为奇数
            f=f*a%d;
        }
        return f;
    }
}

//方法二:飞递归
int power2(int a,int m,int d){
    int f=1;
    while(m>0){
        if(m&1==1){
            f=f*a%d;
        }
        a=a*a%d;
        m>>=1;
    }
    return f;
}

int main(){
    int m,a,c,d;
    scanf("%d%d%d",&a,&m,&d);
    c=power1(a,m,d);
    printf("%d",c);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值