算法分析与设计——2.7 快速幂算法

问题描述:给定一个正整数n和一个实数a,快速计算a^n。

输入:输入实数a  正整数n  。如(2,93)

输出:2^93的值

算法思想:

分治:求a^n的问题可以划分为求a^(n/2)的子问题。并有如下几个条件。
    a=0,return 0;
    n=0,return 1;
    n=2k,return (a^(n/2))^2;
    n=2k+1,return (a^(n/2))^2*a;

代码如下

template <typename T>
T exp2(T a, int n)
{
	if (a == 0)return 0;
	if (n <= 0)return 1;
	else
	{
		double x = exp2(a, n / 2);
		if (n % 2)return (a*x*x);
		else return (x * x);
	}
}

非递归:可以利用二分法。如 计算a^93。n=93转化为二进制表示为:

算法分析与设计——2.7 快速幂算法

所以a^93=a^64 * a^16 * a^8 * a^4 * a^1。

代码如下:

template<typename T>
T exp2(T a, int n)
{
	int i = n;
	double b = a, s = 1.0;
	while (i > 0)
	{
		if (i % 2)s *= b;
		i /= 2;
		b *= b;
	}
	return s;
}

 这两种实现方式的时间复杂度都是O(logn)。

上一篇:LeetCode 93. 复原IP地址


下一篇:93. 复原 IP 地址