【问题】给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
【思路】首先我们来说一个O(n)的方法,这个题目主要考虑到幂指数为负的情况需要对结果求倒数。
1class Solution { 2public: 3 double Power(double base, int exponent) { 4 double res = 1; 5 if(exponent == 0) 6 return 1; 7 if(base == 0) 8 return 0; 9 for(int i = 0;i < abs(exponent); ++i){ 10 res *= base; 11 } 12 if(exponent < 0){ 13 res = 1 / res; 14 } 15 return res; 16 } 17};
显然,上面的算法一定不会合面试官的胃口的,因此我们可以使用一个快幂算法来进行求解!其实际编程不复杂,但是效率很高的!
假设3^64需要64个乘法运算,但如果这样计算的话:
3^1 = 3 (也就是base)
3^2 = (3^1) * (3^1)
3^4 = (3^2) * (3^2)
…
3^64 = (3^32) * (3*32)
这个样子的话,就只算6次乘法,效率提升了很多了!因此我们就可以进行如下编程。
1class Solution { 2public: 3 double Power(double base, int exponent) { 4 if(exponent == 0){ 5 return 1; 6 } 7 if(base == 0){ 8 return 0; 9 } 10 double tmp = base; 11 double res = 1; 12 int e = abs(exponent); 13 while(e > 0){ 14 if(e & 1){ //e & 1相当于e % 2 15 res *= tmp; 16 } 17 e >>= 1; // e >> 1相当于e / 2 18 tmp *= tmp; 19 } 20 return (exponent > 0) ? res : 1 / res; 21 } 22};