问题描述:给定一个正整数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转化为二进制表示为:
所以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)。