快速幂:
n&1:(1即01)
二进制:均为1时为1.
n为奇数时:1
n为偶数时:0
幂
x=pow(a,n)
n为偶数时:x=(a*a)^(n/2)
n为奇数时:x=a*(a*a)^(n/2)
最后n=1返回ans.
#include<iostream>
using namespace std;
int power(int a, int n)//a^n
{
int ans = 1;
while (n > 0)
{
if (n & 1) //当n为奇数时,乘以余下的一个a
ans *= a;
a *= a;
n /= 2;
}
return ans;
}
int main() {
cout << power(2, 4);
return 0;
}
快速幂取模算法:控制数据的大小
(a*b)%c = ((a%c)*(b%c))%c
ll power(ll a, int b)
{
if (b == 0)return 1;
if (b == 1)return a;
if (b & 1)
{
return (a * power(a, b - 1)) % MOD;
}
else
{
ll temp = power(a, b / 2);
return (temp * temp) % MOD;
}
}
分治法求
#include <iostream>
using namespace std;
//位运算版本(更高效)
int quickPow(int a, int b)
{
int base = a;
int res = 1;
while(b)
{
if(b & 1) res *= base;
base *= base;
b >>= 1;
}
return res;
}
/*递归版本
int quickPow(int a, int b)
{
if(b == 0) return 1;
int temp = quickPow(a, b / 2);
if(b & 1) return temp * temp * a;// b奇数
else return temp * temp;
}
*/
int main()
{
int a, b;
cin >> a >> b;
cout<<quickPow(a, b);
return 0;
}