快速幂,我觉得是基于高中讲的
秦九韶算法
即如果算2^15
2^15=2* (2^7)^2 //1次乘,1次平方(即2次乘法)
则需算2^7
2^7=2* (2^3)^2 //1次乘,1次平方(即2次乘法)
则需算2^3
2^3=2* 2^2 //1次乘,1次平方(即2次乘法)
这样一共计算了6次乘法,而不需要15次乘法
时间复杂度为 o以二为底N的对数
根据此思路有递归方程
int pow(int a,int b)//a^b
{
if(b==1)
return a;
if(b&1)//等价与b%2
return a*pow(a*a,b/2);
return pow(a*a,b/2);
}
非递归
int ans=1,base=a;
while(b)
{
if(b&1)
ans*=base;
base*=base;
b>>=1;//等价b/=2
}
另外用二进制思想解释
a^15=a^(2^3+2^2+2^1+2^0)//15化成2进制
=(a^(2^3))*(a^(2^2))*(a^(2^1))*(a^(2^0))//a^(b+c)=a^b*a^c;
看着好麻烦吖,换个角度
2^0 2^1 2^2 2^3
1 1 1 1 (15的二进制)
a a^2 a^4 a^8
对应一下,二进制1就乘上,0就不乘
上述结果就是 第三行全乘上即a^15
2^0 2^1 2^2 2^3
1 0 0 0 (1的二进制)
a a^2 a^4 a^8
结果为a
2^0 2^1 2^2 2^3
1 1 0 0 (3的二进制)
a a^2 a^4 a^8
结果为 a*(a^2)=a^3
2^0 2^1 2^2 2^3
0 1 0 0 (2的二进制)
a a^2 a^4 a^8
结果a^2
2^0 2^1 2^2 2^3
0 0 1 0 (4的二进制)
a a^2 a^4 a^8
结果 a^4
以此类推