本文介绍两种快速幂算法和一种快速乘法算法的 C 实现。

普通幂

逐次连乘,时间复杂度 O(n):

unsigned long long   pow1(int x, int n)
{
	unsigned long long  r = 1;
	while (n--)r *= x;
	return r;
}

二分快速幂

利用二进制分解指数,每轮将底数平方并右移指数,时间复杂度 O(log n):

//二分快速幂
unsigned long long   pow2(int x, int n)
{
	unsigned long long  r = 1, base = x;
	while (n)
	{
		if (n & 1)r *= base; // 如果是奇数
		base *= base;
		n >>= 1;
	}
	return r;


}

二分快速乘法

与快速幂思路相同,将乘法转化为加法,每轮将加数翻倍并右移乘数:

//二分快速乘法
unsigned long long   mult(int x, int n)
{
	unsigned long long  r = 0, base = x;
	while (n)
	{
		if (n & 1)r += base;
		cout <<n<<"        " << (n&1)<<"     "<< base<<"      "<<r << endl;
		base += base;
		n >>= 1;
	}
	return r;


}