快速幂取模 ---> (a^b)%c

来源:互联网 发布:sql的文件保存在哪 编辑:程序博客网 时间:2024/05/22 13:28




首先需要知道一个公式   a*b%c=((a%c)*b)%c,然后就可以根据这个公式试着写一个效率并不高的算法。


/*     (a*a*a*...*a)%c  =((a*a*..*a)%c*a)%c  =(((a*..*a)%c*a)%c*a)%c  =(((((a%c*a)%c...*a)%c*a)%c*a)%c*a)%c*/#include<stdio.h>int qmod(int a,int b,int c){    //根据推出的式子,易知    int sum=a%c;    b=b-1;    while(b--)    {        sum=sum*a%c;    }    //为了更为美观简洁,可写成    int sum=1;//a*1=a    while(b--)    {        sum=sum*a%c;    }    return sum;}int main(){//a*b%c==((a%c)*b)%c  int a,b,c;  while(scanf("%d%d%d",&a,&b,&c)!=EOF)  {      printf("%d\n",qmod(a,b,c));  }}

接下来就是提高效率的问题了,怎样提高效率?


这个公式 a^b %c ,上面已经优化了mod 取模方面

现在关键就是优化 a^b 了。


这两个简单公式需要记住: 1):a^b=(a^2)^(b/2)  -->b为偶数          2):a^b=(a^2)^(b/2)*a  -->b为奇数


#include<stdio.h>int qmod(int a,int b,int c){    int sum=1;    while(b)    {        if(b&1)          sum=sum*a%c;//要多乘一个a;        a=a*a%c;        b>>=1;    }    return sum;}int main(){//a*b%c==((a%c)*b)%c  int a,b,c;  while(scanf("%d%d%d",&a,&b,&c)!=EOF)  {      printf("%d\n",qmod(a,b,c));  }}



附:1): yy 右移 x 代表 yy 除以 2^x                                2):yy 左移移 x 代表 yy 乘以 2^x    



0 0
原创粉丝点击