快速幂
以求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
11=a
2^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;
}