剑指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 };

递归特点:

#一个函数在内部调用自己,叫递归函数,特点如下
# 必须有一个明确的结束条件
#问题规模每递归一次读应该比上一次的问题规模有所减少
#效率低

 

posted @ 2018-08-31 16:24  BreakofDawn  阅读(92)  评论(0编辑  收藏  举报