快速幂
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提高。
快速幂实现原理
快速幂的原理比较好懂,就是说假如我们求的是3^11,其实比较通用的办法就是
for(int i=1;i<11;i++)
{
a*=3;
}
时间复杂度为O(n), 那么我们有没有更快的办法呢? 有的~就是下面要说的快速幂。
快速幂就是把指数进行一次log(N)级别的变换。11 = 1011=2^3+2^1+2^0
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提高。
快速幂实现原理
快速幂的原理比较好懂,就是说假如我们求的是3^11,其实比较通用的办法就是
for(int i=1;i<11;i++)
{
a*=3;
}
时间复杂度为O(n), 那么我们有没有更快的办法呢? 有的~就是下面要说的快速幂。
快速幂就是把指数进行一次log(N)级别的变换。11 = 1011=2^3+2^1+2^0
那么我只需要算3^1和3^2还有3^8这样复杂度就降下来了。算3^1需要一次记为a,把a平方就是3^2记为b,把b平方就是3^4记为c,再平方就是3^8记为d,这样把a b d乘以之后就是结果了。这样速度就快起来了
快速幂代码为:
int pow3(int a,int b)
{
int ans = 1,base = a;
while(b!=0)
{
if(b&1)
ans *= base;
base *= base;
b>>=1;
}
return ans;
}