数值的整数次方

题目剖析

首先看到整数次方,就能够用java本人的Math.pow函数,但本题要求不能应用库函数,所以就会想到分状况探讨而后执行for循环,这样是对的,然而超出工夫限度

题解

二分法加递归

因为n能够分为正负0三种状况,所以当n为正数的应用就是-n左,而后x变为1/x,而后利用n如果是偶数那就是2递归n/2次,如果n是基数那就是n/2次再多乘一个x

二分法,递归很屡次,比拟耗内存

  • 最初的奇偶return能够用三元运算符代替:

    return (n%2==0)?res*res:res*res*x;

疾速幂(二进制角度)


这个办法比拟离奇,有点意思
因为将n转为2进制数,能够将n变为2的几次幂,而后x的n次方,就能够变成x的2的几次幂的方相乘,即n = 5,能够写成101,即5 = 12的2+02的1+12的0.而后x的5次方就能够变为,x的(12的2)x的(02的1)x的(12的0),也就是能够拆开乘

  • x的n次方,把n转二进制:"bm…b3b2b1"

    n = 1xb1+2xb2+4xb3+8xb4+16xb5+……+2^(m-1)bm
  • 于是x的n次方变为:

    X^[1xb1+2xb2+4xb3+8xb4+16xb5+……+2^(m-1)bm]=X^[1xb1]X^[2xb2]X^[4xb3]X^[8xb4]……X^[2^(m-1)bm]=二进制位为1才会乘
  • 留神右移的时候不必操作,间接移位即可,右移一位就是相当于除2,所以就每次都乘x方,而后判断最初一位是1还是0(和1与),是1就多乘一个x,不是就跳过间接返回

    问题

    将n存入long再*-1,就能够防止,边界越界的谬误。(然而不晓得为什么思维一没有这个问题)