剑指offer 数值的整数次方

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 
思路:底数是double类型的浮点数, 指数是int类型:包括0,正负整数。
 
考虑异常情况:
1)0的0次方。
2)底数为0.0时,指数是负整数。
 
代码一:排除异常情况后,求次幂用递归
 1 class Solution {
 2 private:
 3     bool equal(double i, double j) {
 4         //判断两个浮点类型数是否相等
 5         if ((i - j) < 1e-8 && (i - j) > -1e-8) {
 6             return true;
 7         } else {
 8             return false;
 9         }
10     }
11     double power(double base, int exponent) {
12         //当指数为0时,返回1
13         if (exponent == 0) {
14             return 1;
15         }
16         //用移位操作代替/2, 效率快很多, 此时res = base ^ (exponent / 2)
17         double res = power(base, exponent >> 1);
18         // res = base ^ ((exponent / 2) * 2)
19         res *= res;
20         //如果为奇数,res = res * base;
21         if (exponent & 1) {
22             res *= base;
23         }
24         return res;
25     }
26 public:
27     double Power(double base, int exponent) {
28         if (equal(base, 0.0) && exponent <= 0) {
29             return 0.0;
30         }
31         int p = abs(exponent);
32         double res = power(base, p);
33         return exponent < 0 ? (1.0 / res) : res;
34     }
35 };

代码二:快速幂运算

加入底数为a, 指数为11, 我们要求a^11, 11的二进制表示为1011, 于是a^11 = a^(8+2+1) = a^(1000) * a^(0010) * a^(0001)

 1 class Solution {
 2 private:
 3     bool equal(double i, double j) {
 4         //判断两个浮点类型数是否相等
 5         if ((i - j) < 1e-8 && (i - j) > -1e-8) {
 6             return true;
 7         } else {
 8             return false;
 9         }
10     }
11 public:
12     double Power(double base, int exponent) {
13         if (equal(base, 0.0) && exponent <= 0) {
14             //throw new RuntimeException("Denominator cannot be zero");
15             return 0.0;
16         }
17         int p = abs(exponent);
18         double res = 1.0;
19         while (p) {
20             if (p & 1) {
21                 res *= base;
22             }
23             p >>= 1;
24             base *= base;
25         }
26         return exponent > 0 ? res : 1.0 / res;
27     }
28 };

 

posted @ 2019-07-26 11:07  琴影  阅读(286)  评论(0编辑  收藏  举报