C++求快速幂
“快速幂”被归结为一个a的b次方对m取余的问题,即
ab % m
问题的关键在于怎么更快地求得ab,直观的做法是用b次循环去累乘a,时间复杂度是O(b)。而“快速幂”,又成为“二分幂”,通过二分的思想能在O(logb)的复杂度内求得ab。
如果次数b是奇数,则ab可以拆解为a*ab-1
如果次数b是偶数,则ab可以拆解为ab/2*ab/2
奇数拆解一次就会变成偶数,且这么拆解下去,最后需要计算b0,而b0 = 1。然后再依次回退计算即可,显然这是递归的思路,又是一种空间换时间的做法。
代码:
#include <iostream>
using namespace std;
int binaryPower(int a, int b, int m)
{
if (b == 0)
return 1;
else if (b % 2 == 1)
return a * binaryPower(a, b - 1, m) % m;
else
{
int mul = binaryPower(a, b/2, m) % m;
return mul * mul;
}
}
int main()
{
cout << binaryPower(2, 4, 3) << endl;
cout << binaryPower(2, 5, 7) << endl;
return 0;
}
输出:
1
4
避免整型溢出,可以定义更大的数据类型long long。