问题
剑指 Offer 16. 数值的整数次方
难度中等53
实现函数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 = 1/2 = 1/4 = 0.25
说明:
- -100.0 < x < 100.0
- n 是 32 位有符号整数,其数值范围是 [−2, 2− 1] 。
解答

int 越界问题: n 的取值范围为 [ -2, 2- 1] 这个区间中。当 n 为 -2 时,将 n 转为正数,则会出现数据越界问题,所以利用一个 long 型来存储。
算法的执行流程:以 n = 1001(9)为例, 其二进制转十进制为

首先判断 n 是否为负数,如果为负数,则 x = 1/x
while 循环 :
- 判断 exponent 是否为奇数,如果为 (exponent & 1) == 1,说明其二进制位中的数是有效的,将其乘入 res 中,例如 1001 中,有效位为 2 和 2,将其乘入 res 中,0 位则不乘入 res 中,如 2和 2
- x 自身相乘
- exponent 向下整除 2
class Solution {public double myPow(double x, int n) {long exponent = n;double res = 1.0;// n 为负数的情况if (exponent < 0){x = 1 / x;exponent = -exponent;}// 快速幂等while(exponent > 0){if ((exponent & 1) != 0){res *= x;}x *= x ;exponent >>= 1;}return res;}}
