【剑指offer】58.数值的整数次方
总目录:
1.问题描述
实现函数 double Power(double base, int exponent),求base的exponent次方。
注意:
1.保证base和exponent不同时为0。
2.不得使用库函数,同时不需要考虑大数问题
3.有特殊判题,不用考虑小数点后面0的位数。
数据范围:∣base∣≤100  ,∣exponent∣≤100  ,保证最终结果一定满足∣val∣≤104 
进阶:空间复杂度 O(1) ,时间复杂度 O(n)
进阶:空间复杂度 O(1) ,时间复杂度 O(n)
2.问题分析
对于Power(double base, int exponent)
1联乘法
当exponent为正时,将exponent个base联乘起来;当exponent为负时,将|exponent|个1/base联乘起来。
尤其是当base==0时返回0,exponent==0时,返回1.
2快速幂
计算幂运算,我们还可以使用快速幂计算。
规则如下,详见设计巧妙的代码:
 
 
3.代码实例
联乘法
1 class Solution { 2 public: 3 double Power(double base, int exponent) { 4 if (base == 0) { 5 return 0; 6 } 7 if (exponent == 0) { 8 return 1; 9 } 10 11 //处理负指数 12 if (exponent < 0) { 13 base = 1 / base; 14 exponent = -exponent; 15 } 16 17 return base * Power(base, exponent - 1); 18 } 19 };
快速幂
1 class Solution { 2 public: 3 double Pow(double x, int y) { 4 double ret = 1; 5 while (y) { 6 //如果y是奇数 7 if (y & 1) { 8 ret *= x; 9 } 10 11 //指数折半,底数平方 12 y = y >> 1; 13 x *= x; 14 } 15 16 //更巧妙的在于ret *= x不仅联乘了中间指数为奇数时的x,且兜住了底 17 return ret; 18 } 19 20 double Power(double base, int exponent) { 21 if (exponent < 0) { 22 base = 1 / base; 23 exponent = 0 - exponent; 24 } 25 26 return Pow(base, exponent); 27 } 28 };
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号