问题描述:给定一个正整数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)。