首先看到整數次方,就能夠用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循環