offer 16 數值的整數次方

數值的整數次方

image.png

題目分析

首先看到整數次方,就能夠用java本身的Math.pow函數,但本題要求不能使用庫函數,因此就會想到分狀況討論而後執行for循環,這樣是對的,可是超出時間限制
image.png
image.pngjava

題解

二分法加遞歸

由於n能夠分爲正負0三種狀況,因此當n爲負數的使用就是-n左,而後x變爲1/x,而後利用n若是是偶數那就是2遞歸n/2次,若是n是基數那就是n/2次再多乘一個x
image.png
二分法,遞歸不少次,比較耗內存函數

  • 最後的奇偶return能夠用三元運算符代替:spa

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

快速冪(二進制角度)

image.png
這個方法比較新奇,有點意思
由於將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,不是就跳過直接返回
    image.pngit

    問題

    將n存入long再*-1,就能夠避免,邊界越界的錯誤。(可是不知道爲何思想一沒有這個問題)
    image.pngfor循環

相關文章
相關標籤/搜索