快速幂
以求ab为例
把b转换为二进制数。
该二进制数第i位的权为
2i-1
例如
a11=a2^0+2^1+2^3
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
a11=a2^0+2^1+2^3
常规方法
int pow1(int a,int b) { int i,s=1; for(i=1;i<=b;i++) s*=a; return s; }
一般二分
int pow2(int a,int b) { int i,s=1; while(b!=0) { if(b%2==1) s*=a; a*=a;//因为b/2,所以要乘2次a b/=2; } return s; }
有位运算的二分(同pow2)
int pow3(int a,int b) { int i,s=1; while(b!=0) { if(b%2==1) s*=a; a*=a; b>>=1;//其实和pow2一样 } return s; }
快速幂(有位运算,最复杂,但很快)
int pow1(int x,int y) { if(y==0) return 1; else while((y&1)==0) { y>>=1; x*=x; } int s=x; y>>=1; while(y!=0) { x*=x; if((y&1)!=0) s*=x; y>>=1; } return s; }