剑指offer的66题之第12题:数值的整数次方
代码:
方法1:使用累乘
1 class Solution { 2 public: 3 double Power(double base, int exponent) { 4 double res=1; 5 int exp; 6 if (exponent<0){ 7 exp=-exponent; 8 if (base==0) 9 //throw new RuntimeException("指数为负数,分母不能为0"); 10 return 0; 11 } 12 else if(exponent==0) 13 return 1; 14 else 15 exp=exponent; 16 for(int i=1;i<=exp;i++) 17 res=res*base; 18 if(exponent<0) 19 return 1/res; 20 else 21 return res; 22 } 23 };
方法2:
* 1.全面考察指数的正负、底数是否为零等情况。
* 2.写出指数的二进制表达,例如13表达为二进制1101。
* 3.举例:10^1101 = 10^0001*10^0100*10^1000。
* 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
1 class Solution { 2 public: 3 double Power(double base, int exponent) { 4 double res=1; 5 int exp; 6 if (exponent<0){ 7 if (base==0) 8 //throw new RuntimeException("指数为负数,分母不能为0"); 9 return 0; 10 exp=-exponent; 11 } 12 else if(exponent==0) 13 return 1; 14 else 15 exp=exponent; 16 while(exp) 17 { 18 if(exp&1) 19 res=res*base; 20 base=base*base; 21 exp=exp>>1; 22 } 23 return exponent>0?res:1/res; 24 } 25 };
注意:主要是while循环部分。
方法3:递归
1 class Solution { 2 public: 3 double Power(double base, int exponent) { 4 if(exponent>0) 5 { 6 if(exponent==1) 7 return base; 8 if(exponent%2==0) 9 return Power(base,exponent/2)*Power(base,exponent/2); 10 else 11 return Power(base,exponent/2)*Power(base,exponent/2+1); 12 } 13 else if (exponent==0) 14 { 15 return 1; 16 } 17 else 18 { 19 return 1/Power(base,0-exponent); 20 } 21 } 22 };
递归特点:
#一个函数在内部调用自己,叫递归函数,特点如下
# 必须有一个明确的结束条件
#问题规模每递归一次读应该比上一次的问题规模有所减少
#效率低