快速幂(平方求幂)
(一)、十进制做法(递归)
如果n为偶数,二分;如果n为奇数,先把n变成偶数(n-1)再二分
递归结束的尽头是 n==0 return 1 ;
int qpow(int a,int n){
if(n==0)
return 1;
else if(n%2==1)
return qpow(a,n-1)*a;
else
int temp=qpow(a,n/2);
return temp*temp;
}
(二)、二进制做法(非递归)
二进制末尾为0,说明是偶数;二进制末尾为1,说明是奇数。
所以判断二进制奇偶数的方法就是看二进制尾数,也就是 b&1
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
long long root,times,divisor;
//root 底数
//times 次方
//di 除数
long int a,b;
int main(){
cin>>root>>times>>di;
long long res=1;
a=root;
b=times;
//root times 会变化,所以要保护
while(b){
if(b&1)//二进制数最后一位是否为1
{
res=(res*a)%di;
}
a=(a*a)%di;
b>>=1; //除2
}
printf("%ld^%ld mod %ld=%ld",root,times,di,res);
return 0;
}