快速幂算法,真的牛皮,幂不断除以2取整,如果当前为偶数,则返回当前幂一半的值的数,再平方,若是奇数,那再乘上1个x好了,递归代码如下
class Solution { public: double generate(double x,int n) { if(!n) return 1; double y = generate(x,n/2); if(n%2 == 0) return y*y; else return y*y*x; } double myPow(double x, int n) { if(n > 0) return generate(x,n); else return 1/generate(x,n); } };
迭代的方法很透。因为这一方法是自顶向下的,而迭代算法在这里对于处理自顶向下的是比较困难的。而我们在快速幂的分析过程中,可以得出这样一个结论,最后的结果是由n个x经过不同次数的平方之后相乘得到的,而这一思路则可以通过二进制来描述,对于某一个数的二进制表示,其不同位上的1代表有一个x经过了几次平方后为这个数作出贡献,比如第四位是1,就代表x^8参与了运算,有一个x经过了4次平方,与其他分量乘在一起,达到了效果。贴代码
1 class Solution { 2 public: 3 double generate(double x,long long n) 4 { 5 if(x == 1) 6 return 1; 7 double res = 1.0; 8 double temp = x; 9 while(n>0) 10 { 11 if(n % 2 == 1) 12 res *= temp; 13 temp *= temp; 14 n /= 2; 15 } 16 return res; 17 } 18 double myPow(double x, int n) 19 { 20 if(n == 0) 21 return 1; 22 long long N = n; 23 return n>=0?generate(x,N):1.0/generate(x,-N); 24 } 25 };
在变量类型上的处理有一些问题,需要注意。