剑指offer系列6:数值的整数次方

在计算float和double型的变量时,判断值为0不能直接判断是否等于0,因为计算机表示小数时存在误差,所以判断两个数的误差的绝对值很小即可认为相等。

在要做除法运算时,如果除以2,用右移运算代替可以提高效率。

 1 #include<iostream>
 2 using namespace std;
 3 class Solution {
 4 public:
 5     double Power(double base, int exponent) {
 6         if (base == 0)
 7         {
 8             return 0;
 9         }
10         if (exponent == 0)
11         {
12             return 1;
13         }
14         unsigned int absexponent = (unsigned int)exponent;//给指数取绝对值
15         if (exponent < 0)
16         {
17             absexponent = (unsigned int)(-exponent);//如果是负数直接强转类型后数值错误,所以给他改正回去
18         }
19         double re=1;
20         if(absexponent !=1)
21         { 
22             re = Power(base, absexponent >> 1);//右移除以2
23             re *= re;
24         }
25 
26         if (absexponent & 0x1)//与1进行与运算判断这个数是否为奇数
27         {
28             re *= base;
29         }
30         if (exponent < 0)
31         {
32             re = 1 / re;
33         }
34         return re;
35     }
36 };
37 int main()
38 {
39     Solution so;
40     cout << so.Power(2, 4) << endl;
41     return 0;
42 }

我开始拿到这个题还在想这不是pow函数可以解决的事情吗?看了答案发现就是要注意已有的函数的实现方法。其中有一些小细节要注意。

posted @ 2019-06-04 19:06  妮妮熊  阅读(116)  评论(0编辑  收藏  举报