第一课 快速幂取模

站在acm的角度上看,《算法概论》这本书上感觉废话好多。

始终觉得学算法的最佳途径就是做题,而不是单纯的看书看伪算法。实现才是王道。

快速幂取模,其实也是以前写过的二分求幂,或离散课上的同余幂。

以前写的代码版本太乱,现在总结一下,以便以后碰到这类问题能直接对症下药。

 

求b^e mod m,b,e,m都是比较大的整数。

递归算法:

 1 //快速幂取模 
 2 int modexp(int b, int e, int m)    //b是底数,e是指数,m是模 
 3 {
 4     if (e == 0)
 5         return 1;
 6     
 7     int temp = modexp(b, e/2, m);
 8     
 9     if (e%2)  //若e是奇数,那么除以2后会少乘一个b. 
10         return b*temp*temp%m;
11     else
12         return temp*temp%m;
13 }

 

非递归算法:

 1 int modexp(int b, int e, int m) 
 2  {
 3      int ans = 1; 
 4      
 5      while (e)
 6      {
 7          if (e%2)  //若e是奇数,那么除以2后会少乘一个b.
 8              ans = ans*b%m;
 9          
10          b = b*b%m;
11          
12          e /= 2;
13      }
14      
15      return ans;
16  }
posted @ 2013-03-23 17:48  Norcy  阅读(395)  评论(0编辑  收藏  举报