学习笔记:快速幂

【定义】快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

【举例】
以下以求a的b次方来介绍
把b转换成二进制数。
该二进制数第i位的权为2^(i-1)
例如a^11=a^(2^0+2^1+2^3)
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算a^(2^0)*a^(2^1)*a^(2^3)
【实现】
快速幂可以用位运算这个强大的工具实现
b&1 {也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
b>>1{就是去掉b的二进制最低位(即第0位)}
【代码】
1、常规求幂
1 int pow1(inta,intb)
2 {
3     int r=1;
4     while(b--)
5         r*=a;
6     return r;
7 } 
常规求幂

2、二分求幂(一般)

 1 int pow2(inta,intb)
 2 {
 3 int r=1,base=a;
 4 while(b!=0)
 5 {
 6     if(b%2)
 7         r*=base;
 8     base*=base;
 9     b/=2;
10 }
11 return r;
12 }
二分求幂(一般)

3、二分求幂(位操作)

 1 int pow3(int a,int b)
 2 {
 3     int r=1,base=a;
 4     while(b!=0)
 5     {
 6         if(b&1)
 7             r*=base;
 8         base*=base;
 9         b>>=1;
10     }
11     return r;
12 }
二分求幂(位操作)

4、快速幂(位运算)

 1 int pow4(int x,int n)
 2 {
 3     if(n==0) return 1;
 4     else
 5     {
 6         while((n&1)==0)
 7         {
 8             n>>=1;
 9             x*=x;
10         }
11     }
12     int result=x;
13     n>>=1;
14     while(n!=0)
15     {
16         x*=x;
17     if((n&1)!=0)
18         result*=x;
19     n>>=1;
20     }
21     return result;
22 }
快速幂(位运算)

 

posted @ 2016-07-04 15:46  SBSOI  阅读(309)  评论(0编辑  收藏  举报