数值的整数次方
题目分析
首先看到整数次方,就可以用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,就可以避免,边界越界的错误。(但是不知道为什么思想一没有这个问题)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。