一般来说,我们计算一个数x的n次幂的时候,认为很是简单。直接乘以x,n次即可。
但是,当我们的n比较大的时候,这将是一个非常花费时间的事情。一下,将描述两种快速幂的方法。
普通计算法:
long long ans=1;
for(int i=1;i<=n;i++)
ans*=x;//x乘以n次.
快速幂的方法:
long long Quick_Power(long long x,long long m){
long long ans=1,mid=x;
while(m){
if(m%2) ans=ans*mid;
mid=mid*mid;
m=m/2;
}
/*
这种做法,就是利用以乘得的积用来累乘.
例如 999 二进制为1111100111
二进制各位权值为x^(2n)
x^999=(x^512)*(x^256)*(x^128)*(x^64)*(x^32)*(x^4)*(x^2)*x
*/
return ans;
}
一个更具时间效率的快速幂
long long Quick_Power(long long x, long long n)
{
//其实,这种方法也就的第一种方法的扩展.
//把指数变小,而指数变大.
//比如2^8==4^4==16^2
//而如果指数本来就是一个奇数的话,效率就一样了.
long long ans;
while(n%2==0)
{
n=n/2;
x=x*x;
}
ans=x;
n=n/2;
while(n!=0)
{
x=x*x;
if(n%2) ans=ans*x;
n=n/2;
}
return ans;
}
由此可以看到,快速幂的效率余指数还是有关的。。