剑指 Offer 16. 数值的整数次方

1. 题目

实现 pow(xn) ,即计算 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为整数:x=  (x2)n/2
  • 当n为奇数:x= x (x2)n/2,即会多出一项。

因此,算法流程为:

  • 当 x = 0x=0 时:直接返回 00 (避免后续 x = 1 / xx=1/x 操作报错)
  • 初始化 res = 1res=
  • 当 n < 0n<0 时:把问题转化至 n geq 0n0 的范围内,即执行 x = 1/xx=1/x ,n = - nn=
  • 循环计算:当 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 }
View Code

4. 结语

  努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

  如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

但行好事 莫问前程
原文地址:https://www.cnblogs.com/haifwu/p/14983258.html