首先看到整数次方,就能够用java本身的Math.pow函数,但本题要求不能使用库函数,因此就会想到分状况讨论而后执行for循环,这样是对的,可是超出时间限制java
由于n能够分为正负0三种状况,因此当n为负数的使用就是-n左,而后x变为1/x,而后利用n若是是偶数那就是2递归n/2次,若是n是基数那就是n/2次再多乘一个x
二分法,递归不少次,比较耗内存函数
最后的奇偶return能够用三元运算符代替:spa
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),也就是能够拆开乘code
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,不是就跳过直接返回it
将n存入long再*-1,就能够避免,边界越界的错误。(可是不知道为何思想一没有这个问题)for循环