快速幂两种实现方式(本质一样)
作者:
Qjwwww
,
2022-03-28 17:54:20
,
所有人可见
,
阅读 153
核心代码
#include<bits/stdc++.h>
using namespace std;
int a,b,p;
int main()
{
cin>>a>>b>>p;
//依次遍历b的每一位,从最低位开始
int res = 1%p;//表示b的最低位即2^0
for(;b;b>>=1)
{
//b&1表示取出b的最低位
//若最低位是1,则将a累乘进res
//若最低位是0,则无需将a累乘进res
if(b&1) res = (long long)res*a%p;
a = (long long)a*a%p;
}
cout<<res;
return 0;
}
算法思想
用遍历二进制形式下的b的每一位来实现,如果是1,则将其累乘如最后结果,即
if(b&1) res = (long long)res*a%p;
反之a*=a
即计算出当前2^x(x为当前的位数)
代码2(朴素算法)
#include<bits/stdc++.h>
using namespace std;
long long a,b,p;
long long res;
int main()
{
cin>>a>>b>>p;
//求a^b
int t = a;
res = 1;
while(b>0)
{
if(b%2==1) res = (res*a)%p;
a = (a*a)%p;
b/=2;
}
cout<<res%p;
return 0;
}