从零学算法50

50 .实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。

示例 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

  • 还真没我想的那么简单,这题可以学一下快速幂,我就直接说结论了,有兴趣的可以看原文。ok 首先显而易见我们最终要求的是 x^n^,然后我们知道 x^n^ = x^a+b^(a+b=n)=x^a^x^b^。神来之笔就来了,我们把 n 转成二进制,比如 n 为 5,我们就得到了 0101,二进制转十进制都知道吧,这个 0101 的含义就是 0 x 2^3^ + 1 x 2^2^ + 0 x 2^1^ + 1 x 2^0^,也就是说 x^n^ 比如 x^5^ 我们最终可以表示成 x^0101^ 也就是 x 的 0 x 2^3^ + 1 x 2^2^ + 0 x 2^1^ + 1 x 2^0^ 次 = x^8x0^x^4x1^x^2X0^x^1x1^,你会发现这最终转换成了求 x^1a^x^2b^x^4c^x^8d^...x^y^的问题,所以我们最终遍历求解时只需要两个操作,不断累乘 x 使得其成为 x^1^x^2^x^4^...,还有就是不断获取那些 abcd 是 0 还是 1,获取也很简单,二进制数 b 的最右位为 b&1,取完以后 b>>1,就等于把第二最右位移到了最右位。
java 复制代码
  public double myPow(double x, int n) {
      long b = n;
      double ans = 1.0;
      // 由于 int 范围为 -2的31次 <= n <= 2的31次-1,所以 -n 可能会超出 int 能表示最大值,就用了 long
      if(b < 0){
          b=-b;
          x=1/x;
      }
      while(b>0){
      	// 如果此时的 abcd 对应的是 1 就乘 x,否则其实就是乘以 1,所以可以跳过
          if((b&1)==1)ans*=x;
          // 累乘 x 得到下一个 x 的 y 次方(y 为 2 的 n 次)
          x*=x;
          // 等待下一位 abcd,因为 >> 相当于整除 2,所以循环结束条件就是 b > 0
          b>>=1;
      }
      return ans;
  }
相关推荐
Mr_Xuhhh44 分钟前
递归搜索与回溯算法
c语言·开发语言·c++·算法·github
SoraLuna1 小时前
「Mac玩转仓颉内测版12」PTA刷题篇3 - L1-003 个位数统计
算法·macos·cangjie
爱吃生蚝的于勒3 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
ChoSeitaku8 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
Fuxiao___8 小时前
不使用递归的决策树生成算法
算法
我爱工作&工作love我8 小时前
1435:【例题3】曲线 一本通 代替三分
c++·算法
白-胖-子9 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower9 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯9 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
Sunyanhui19 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展