7 快速幂
- 不多说,先上代码
#include <bits/stdc++.h>
using namespace std;
long long fastpower(long long a , long long b)
{
long long ans = 1;
while (b > 0)
{
if (b&1)
{
ans *= a;
}
a *= a;
b >>= 1;
}
return ans;
}
int main()
{
cout << fastpower(2,8);
}
快速幂的核心思路在下面这串代码里
while (b > 0)
{
if (b&1)
{
ans *= a;
}
a *= a;
b >>= 1;
}
Important
b是我们的指数,只要大于零,我们便把这个循环继续下去
对任何一个数,都可以拆解为2进制的数,快速幂的核心思想在于,在幂次b二进制转化为十进制的时候是可以不用乘进结果的而 是需要被乘进结果的
示例:
假设我们要计算 :
- 的二进制表示是 。
- 从最低位开始:
- 第一位(1):需要 。
- 第二位(0):不需要 。
- 第三位(1):需要 。
- 第四位(1):需要 。
因此,我们可以计算:
- 只要b大于零,我们就把他的二进制右移(除二),这样我们就能获取下一位二进制数字
- 如果b的二进制位为1,我们就把该位置的幂次方乘进ans中,待b移位完成后ans也完成了幂运算
- 快速幂的时间复杂度为