码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-07 11:11:44      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:快速幂   c语言   




首先需要知道一个公式   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    



版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:快速幂   c语言   

原文地址:http://blog.csdn.net/stffer/article/details/47333769

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!