快速幂
快速幂顾名思义,就是快速计算某个数的多少次幂(即a的b次方)。一般的,我们通常采用连乘的方式求解此类问题,时间复杂度为O(N)。但是,当a,b都比较大时,如何快速的求出它的值呢?采用快速幂的方式可以将时间复杂度变成 O(log₂N)。
快速幂原理:(位操作)将指数b化为二进制后计算
例如:求a^15
15化为二进制为1111,即15=2^3+2^2+2^1+2^0;
那么a^15=a^(2^3+2^2+2^1+2^0)=a^(2^3)*a^(2^2)*a^(2^1)*a^(2^0),
则求a^15值转化为求a^(2^3)*a^(2^2)*a^(2^1)*a^(2^0)的值。
而在位运算中,有两个运算恰好可以做到这些,b and 1(b&1就是取b的二进制最末位);b shr 1(b>>=1就是去掉b的二进制最末位)
常规方法求a^b
#include<cstdio>
#include<iostream>
using namespace std;
//常规方法计算a^b
long long POW(long long a,long long b)
{
long long s=1;
while(b--)
s*=a;
return s;
}
int main()
{
long long a,b;
scanf("%I64d%I64d",&a,&b);
printf("%I64d\n",POW(a,b));
return 0;
}
快速幂求a^b
#include<cstdio>
#include<iostream>
using namespace std;
//快速幂求a^b
long long POW(long long a,long long b)
{
long long r=1,base=a;
while(b!=0)
{
if(b&1)//取b的二进制末位
r*=base;
base*=base;
b>>=1;//去除b的二进制末位
}
return r;
}
int main()
{
long long a,b;
scanf("%I64d%I64d",&a,&b);
printf("%I64d\n",POW(a,b));
return 0;
}