快速幂求A^BmodC

来源:互联网 发布:英雄联盟网络断开连接 编辑:程序博客网 时间:2024/05/17 08:00

以前真心没怎么学过快速幂,只是听过,知道大致的思路,主要就是求A^BmodC的题目。就是将B依次除以2,即求A^(B/2)modC,依次类推,之前我一直纳闷,比如求45^67mod89吧,应该是先算45^33mod89,45^33mod89比较难算,再分,45^16mod89,45^8mod89,45^4mod89,45^2mod89,45^1mod89,如此再反过来算,感觉很麻烦,之前我一直都是用一个数组记录modC的余数,根据数学学的,除以C取余,余数一共有C个,即0,1,2,3,4,……C-1,所以数组的大小只跟C有关,用一个for循环,得出余数数组,循环过程中肯定会重复,当重复的时候或结果为0的时候,即可break,之后用B除以数组的长度,余数为k,即可得到A^BmodC的结果了为a【k-1】,代码如下

#include<stdio.h>
#define n 32768
main()
{
int a,b,c,i,j,d[n];
    while(scanf("%d %d %d",&a,&b,&c)!=EOF)
{
for(i=0;i<n;i++)
{
if(i==0)
d[0]=a%c;
else
{
d[i]=(a*d[i-1])%c;
if(d[i]==d[0]||d[i]==0)
break;
}
}
        j=b%i;
if(d[i]==0)
printf("0\n");
else
if(j==0)
printf("%d\n",d[i-1]);
else
printf("%d\n",d[j-1]);
}
}

但是当c很大时,可能会超出范围,所以就考虑用快速幂的方法做,代码如下

#include<stdio.h>
#define n 32768
main()
{
int a,b,c,j;
    while(scanf("%d %d %d",&a,&b,&c)!=EOF)
{
j=1;
while(b>0)
{
if(b%2!=0)
j=(j*a)%c;
b=b/2;
a=(a*a)%c;
}
printf("%d\n",j);
}
}

看上去简单了很多,可以不用递归调用。

而快速幂的时间复杂度为O(log2N)。比较实用。













原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 突然恶心想吐是怎么办 孕4个月反胃呕吐怎么办 怀孕2月反应大怎么办 狗吐拉稀不吃饭怎么办 狗狗咳喘怎么办最有效 半永久纹眉失败怎么办 纹的眉毛太细了怎么办 眉毛颜色做深了怎么办 半永久眼线不掉怎么办 移植9天来月经怎么办 月经迟迟不来该怎么办 lol晋级赛输了怎么办 激素正常的多囊怎么办 右侧输卵管通而不畅怎么办 小该咳嗽老不好怎么办 孩子吓着了怎么办最快 2个月宝宝吓到了怎么办 3个月宝宝吓到了怎么办 宝宝吓着了发烧怎么办 好几个月不遗精怎么办 孕妇吃了黑橄榄怎么办 内膜4mm来月经了怎么办 吃了伟哥没效果怎么办 维a酸乳膏副作用怎么办 颈椎病引起的头晕恶心怎么办 经常头疼怎么办最快最有效 感昌了头晕乏力怎么办 来例假喝啤酒了怎么办 来月经喝啤酒了怎么办 吃的油腻长痘怎么办 兔子拉黑色稀便怎么办 宝宝补钙便秘了怎么办 吃了肾宝片上火怎么办 吃肾宝片就上火怎么办 吃肾宝片后上火怎么办 孕妇吃了扁桃仁怎么办 怀孕吃了扁桃仁怎么办 经期吃了阿胶糕怎么办 10儿童咳嗽有痰怎么办 6岁宝宝咳嗽有痰怎么办 儿童6岁咳嗽有痰怎么办