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。

posted @ 2021-02-16 13:53  MorpheusDong  阅读(129)  评论(0编辑  收藏  举报