剑指Offer16 数值的整数次方

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

 

示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
 

说明:

-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

 

题目不新鲜,但是要注意几个点:

1.注意溢出,这里书上没有考虑INT_MIN取反溢出的问题

2.尽量使用位运算,效率更高

3.使用幂计算,效率为O(logn)

 1 class Solution {
 2 public:
 3     double myPow(double x, int n) {
 4         if(!x )
 5             throw ("x equal to zero error");
 6         long long absn=n;
 7         if(n<0)
 8             absn=-absn;
 9         double result=power(x,absn);
10         if(n<0)
11             return 1.0/result;
12         return result;
13     }
14 
15     double power(double base, long long exponent)
16     {
17         if(!exponent)
18             return 1;
19         if(exponent==1)
20             return base;
21         double ret=power(base, exponent>>1);
22         ret*=ret;
23         if(exponent&1==1)
24             ret*=base;
25         return ret;
26     }
27 };

 

第二次做,一是没有想到递归的方法,然后处理INT_MIN转化成INT_MAX会溢出的问题,但是增加了错误处理。

 1 enum{Valid, InValid};
 2 int g_myPow=Valid;
 3 
 4 class Solution {
 5 public:
 6     double myPow(double x, int n) {
 7         if(x<-100.0 || x>100.0){
 8             g_myPow=InValid;
 9             return 0.0;
10         }
11         long long absn=abs(n);
12         double ret=recursive_pow(x,absn);
13         if(n<0)
14             return 1/ret;
15         return ret;
16     }
17 
18     double recursive_pow(double base, long long exp){
19         if(exp==0)
20             return 1;
21         if(exp==1)
22             return base;
23         double ret=recursive_pow(base,exp>>1);
24         ret*=ret;
25         if(exp&1==1)
26             ret*=base;
27         return ret;
28     }
29 };

 

posted @ 2020-07-03 11:15  __rookie  阅读(185)  评论(0编辑  收藏  举报