第一课 快速幂取模

站在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  }

你可能感兴趣的:(快速)