快速幂
设想一下,如果求a^b,可以通过循环,但是当b很大时,会面临超时的问题,所以我们引入快速幂
给定一个a^b,通过将b以二进制形式拆分,按位取出。
任何一个十进制的b都可以变成二进制数
例:b=9;转换成二进制为1001,在通过位运算(&1),判断二进制每一位是0是1
通过二进制运算(具有指数型递增的特点,所以能实现快速求一个数的n次幂)使其求出a^b;
位运算知识
& 运算符可以直接对二进制进行操作,1 & 1 = 1,1 & 0 =0, 0 & 1 = 0, 0 & 0 = 0,
初版快速幂代码
int quick_pow(int a,int b)//实现快速幂的函数,计算a^b;
{
int ans = 1;
while(b){//当b!=0
if(b&1)//如果b的二进制当前位数是1
ans*=a;
b>>=1;//将b的二进制形式向右移位
a*=a;
}
return ans;
}
取模版快速幂代码
补充知识点
(a *b *c *d )%p = (((a *b)%p *c)%p *d)%p
//取模版快速幂代码
//如果在运算过程中long long也不能储存数据,或者求a^b的最后n位,使用取模版快速幂
long long quick_pow(long long a,long long b,long long p)
{
int ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%p;
b>>=1;
a=(a*a)%p;
}
return ans;
}
完整代码如下
#include <iostream>
using namespace std;
//快速幂代码
int quick_pow(int a,int b)//实现快速幂的函数,计算a^b;
{
int ans = 1;
while(b){//当b!=0
if(b&1)//如果b的二进制当前位数是1
ans*=a;
b>>=1;//将b的二进制形式向右移位
a*=a;
}
return ans;
}
//取模版快速幂代码
//如果在运算过程中long long也不能储存数据,或者求a^b的最后n位,使用取模版快速幂
long long quick_pow(long long a,long long b,long long p)
{
//和快速幂代码基本没区别
int ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%p;
b>>=1;
a=(a*a)%p;
}
return ans;
}
int main()
{
int a=5,b=13;//以5^13次方为例
int p=1000;
cout<<quick_pow(a,b)<<endl;;
cout<<quick_pow2(a,b,p)<<endl;;
return 0;
}
如果有问题希望各位大佬指正,出自刚刚接触算法的小白。