题目描述

image.png

解题思路

简单理解快速幂🔗
快速幂也就是使用二进制和权重来表示,例如 :
image.png
那么怎么通过二进制来表示呢?
1011可以表示,此时第一位的权重为x^0,第二位的权重为x^2,第三位为x^8,所以此时
image.png
只有当二进制数为1时才有相应的权重。这也就是为什么需要通过与运算:(b & 1) == 1判断最后一位是否为1。
image.png

  1. class Solution {
  2. public double myPow(double x, int n) {
  3. if (n == 0) return x;
  4. long b = n;
  5. double res = 1.0;
  6. // 此时n为负数时,转化n为相反数,对应的x变为分数,此时权重也有响应的变化
  7. if (b < 0) {
  8. x = 1 / x;
  9. b = -b;
  10. }
  11. while (b > 0) {
  12. // 注意和1相与判断是否具有权重
  13. if ((b & 1) == 1) {
  14. res *= x;
  15. }
  16. // 此时权重需要乘自己,增大权重
  17. x *= x;
  18. // 向右移动一位
  19. b >>= 1;
  20. }
  21. return res;
  22. }
  23. }