描述: 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
之前没刷过类似的题, 很明显先想到循环相乘,那就O(n)复杂度了。
有想过分解开进行乘,感觉需要什么东东来优化一下步骤。
这是一个关于快速幂的知识,其实就是将幂转换成二进制形式, 比如说对于 ab,b 等于 9, 9 的二进制是 1001 , 然后 ab 就等于 a20 * a23 ,等效变换为 (a)2 * (a22)2 。
所以这样就好办了, 幂转换成二进制有几位就循环几次, 复杂度降低到O(log2 n)。 然后每次循环都对基数 a 进行自乘,也就是每次循环对 a 进行平方运算。当循环到幂的二进制表示中为1的位, 将其累乘起来就好了。
初次代码实现(注意:有错):
1 class Solution { 2 public: 3 double Power(double base, int exponent) { 4 if(exponent == 0) 5 return 1; 6 if(base == 0) 7 return 0; 8 9 double result = 1; 10 while(e) 11 { 12 if(e & 1) 13 result *= base; 14 base *= base; 15 e >>= 1; 16 } 17 return result; 18 } 19 };
提交检测后发现不对啊, 想了想, 自己只考虑了幂为 0 和非 0 的情况, 但是幂为负数的情况没有考虑。
所以接下来修改为:
1 class Solution { 2 public: 3 double Power(double base, int exponent) { 4 int e = -1; 5 if(exponent == 0) 6 return 1; 7 else if(exponent < 0) 8 e = - exponent; 9 else 10 e = exponent; 11 if(base == 0) 12 return 0; 13 14 double result = 1; 15 while(e) 16 { 17 if(e & 1) 18 result *= base; 19 base *= base; 20 e >>= 1; 21 } 22 return exponent < 0 ? (1 / result) : result; 23 } 24 };