1. 题目
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
2. 示例
示例1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104
3. 题解
一般涉及二进制的都与位运算相关。
本题采用二分法。
xn=xn/2 × xn/2= (x2)n/2,令n/2为整数,则需要分为奇偶两种情况:
- 当n为整数:xn = (x2)n/2
- 当n为奇数:xn = x (x2)n/2,即会多出一项。
因此,算法流程为:
- 当 x = 0x=0 时:直接返回 00 (避免后续 x = 1 / xx=1/x 操作报错)
- 初始化 res = 1res=1
- 当 n < 0n<0 时:把问题转化至 n geq 0n≥0 的范围内,即执行 x = 1/xx=1/x ,n = - nn=−n
- 循环计算:当 n = 0n=0 时跳出
- 当 n & 1 = 1n&1=1 时:将当前 xx 乘入 resres (即 res *= xres∗=x )
- 执行 x = x^2x=x2 (即 x *= xx∗=x )
- 执行 nn 右移一位(即 n >>= 1n>>=1)
3. 实现
1 class Solution {
2 // 位运算
3 public double myPow(double x, int n) {
4 if(x == 0) return 0;
5 if(n == 0) return 1;
6 if(x == 1) return 1;
7 // 防止n为负数时,-n就会越界
8 // n属于[−2147483648,2147483647]
9 long b = n;
10 double res = 1.0;
11 // 将n变到正数范围
12 if(b < 0) {
13 x = 1 / x;
14 b = -b;
15 }
16 // 遍历
17 while(b > 0) {
18 // (b & 1) == 1 等价于 b % 2 == 1
19 // 当b取2余,多出一项,乘如x
20 if((b & 1) == 1) res *= x;
21 // x 变成 x^2
22 x *= x;
23 // b>>1等价于b // 2向下取整
24 b >>= 1;
25 }
26 return res;
27 }
28 }
4. 结语
努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!
如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。