剑指offer-16
剑指 Offer 16. 数值的整数次方
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
示例
1 | 输入:x = 2.00000, n = 10 |
解法
解法一:暴力法
超时
解法二:快速幂
快速幂解析(二进制角度):
利用十进制数字 n 的二进制表示,可对快速幂进行数学化解释。
1 | - 对于任何十进制正整数 $n$,设其二进制位 $ b _ { m } \ldots b_3 b_2 b _ { 1 }$($b_i$为二进制某位值,$i\in [1,m]$),则有: |
快速幂解析(二分法角度):
二分推导:$x ^ { n } = x ^ { n / 2 } \times x ^ { n / 2 } = \left( x ^ { 2 } \right) ^ { n / 2 }$,令$n/2$为整数,则需要分为奇偶两种情况(设向下取整除法符号为 “//“ ):
- 当 $n$ 为偶数:$x ^ { n } = \left( x ^ { 2 } \right) ^ { n / / 2 }$
- 当 $n$ 为奇数:$x ^ { n } = x \left( x ^ { 2 } \right) ^ { n / / 2 }$,既会多出一项 $x$;
幂结果获取:
根据二分推导,可通过循环 $x = x ^ { 2 }$ 操作,每次把幂从 $n$降至 $n//2$,直至幂降为0;
设 $res=1$,则初始状态 $x^n = x^n \times res$。在循环二分时,每当 $n$ 为奇数时,将多出的一项 $x$ 乘入 $res$ ,则最终可化至 $x ^ { n } = x ^ { 0 } \times r e s = r e s$,返回 $res$ 即可。
循环 $x^n$ res 1. $3^5$ 1 2. $9^2$ 1,3 3. $81^1$ 1,3 4. $6561^0$ 1,3,81
转为位运算:
- 向下整除 $n//2$,等价于右移一位 $n>>1$;
- 取余数 $n%2$,等价于判断二进制最后一位 $n&1$;
算法流程:
- 当 $x=0$ 时:直接返回$0$(避免后续$x=\frac{1}{x}$操作报错)。
- 初始化 $res=1$;
- 当 $n<0$时:把问题转化至 $n \geq 0$ 的范围内,既执行 $x=\frac{1}{x}, n=-n$;
- 循环计算:当$n=0$时退出;
- 当 $n&1=1$时:将当前 $x$ 乘入 $res$ (既 $res *= x$);
- 执行 $x=x^2$(既$x*=x$);
- 执行 $n$ 右移一位(既 $n>>=1$)。
- 返回$res$。
1 | class Solution: |