题目描述
- 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
- 地址:牛客链接
解决方法
- 这是一道极其经典的位运算题目
- 首先,这是一个有很多特殊情况的题:
- 指数为0时,直接返回1
- 底为0,但是指数为负数时,发生除0异常,指数为正数时,返回0;
- 其他情况(使用以下三种方法)
- 方法1:判断完边界条件后,直接循环,若指数绝对值大小为 n ,那么该方法时间复杂度为 O(n)
方法2 : 利用快速幂的思想,例如 求 3^11, 那么指数 11 的二进制为 1011 ,对于 1011 ,从右到左,每一位分别对应着 1, 2, 4, 8.而 3^11 = 3^(1011) = 3^(1000 + 0010 + 0001)= 3^8 * 3^2 + 3^1。所以我们可以这样看,1011从右到左依次对应着 3,3^2, 3^4, 3^8,这是一种翻倍的关系。
所以,只要我们对指数的二进制逐位得到每一位数字,看当前位是1还是0,若是1,则累乘进res,并在每一次逐位的过程中完成翻倍,3,3^2, 3^4, 3^8。
那么如何逐位得到二进制的每一位数字呢? 利用 左移>> 与 & ,&1 可以得到最低位的值,然后 将当前数字 >> 可以得到 下一位值上的数,直至变为0。时间复杂度: O(log N)
方法3: 递归。3^11 = 3^5 * 3^5 3 3^10 = 3^5 3^5. 所以首先判断指数的奇偶性
- 若为奇数:f(base, exp) = f(base, exp > >1) * f(base, exp > >1) * base
- 若为偶数:f(base, exp) = f(base, e