劍指 offer 刷題 16 數值的整數次方

2021-10-04 17:54:21 字數 1523 閱讀 4938

給定乙個 double 型別的浮點數 base 和 int 型別的整數 exponent。求 base 的 exponent 次方。

保證 base 和 exponent 不同時為 0。

我們首先要考慮到的是,冪運算時底數不能為 0。

其次,題目裡的 exponent 是 int 型的,整數要分成正整數、0 和 負整數三種情況。任何數的 0 次方結果為 1;負整數次方的結果可以用正整數次方的結果來計算,如 2−3

=123

2^ = \frac

2−3=23

1​。所以我們只需計算 base 的正整數次方。

class

solution

return n >

0? result :(1

/ result);}

}

這種實現簡單直觀,但並不高效。如果輸入的 exponent 為 32,就要在迴圈中做 31 次乘法。

如果我們的目標是求乙個數的 32 次方,倘若我們已經知道了這個數的 16 次方,只需要再平方一次就可以了,而 16 次方的結果由 8 次方結果的平方得到。以此類推,我們求 32 次方只需要做 5 次乘法,即,先平方,再 4 次方,再 8 次方,再 16 次方,最後 32 次方。

當然,乙個數的 n 次方也要分 n 為奇數和偶數兩種情況:

這個公式可以通過遞迴實現。

class

solution

// 乙個數的正整數次方

public

double

powwithpositive

(double x,

int n)

}

上面的實現方法相當於,在求 m 的 n 次方時,把 n 拆為幾個整數的和來進行計算,只是這幾個整數比較特殊(16、8、4、2、1)。相當於把 n 表示為二進位制數,再按照二進位制位拆分成幾個數的和。比如,要算 m

13m^

m13,把 13 拆成二進位制數的和,即 m

1101=m

1000

+0100

+0000

+0001=m

1000×m

0100×m

0001

m^ = m^ = m^ \times m^ \times m^

m1101=

m100

0+01

00+0

000+

0001

=m10

00×m

0100

×m00

01所以,我們可以通過 & 1 和 >>>1 來逐位讀取 1101,若當前位為 1,則將該位代表的乘數累乘到最終結果中。

public

class

solution

public

double

powwithpositive

(double base,

int exponent)

return res;

}}

劍指offer刷題 16

面試題32 從上到下列印二叉樹 題目1 不分行從上到下列印二叉樹。從上到下列印二叉樹的每個節點,同一層的節點按照從左到右的順序列印。struct binarytreenode 這種遍歷是按層遍歷 規律 每次列印乙個節點時,如果該節點有子節點,則把該節點的子節點放到乙個佇列的末尾,void print...

劍指offer刷題

面試題6 從尾到頭列印鍊錶 struct listnode class solution reverse res.begin res.end return res 替換空格class solution int newnumstr numstr numspace 2 if newnumstr leng...

劍指offer刷題

原題鏈結 動態規劃 class solution dp for int i 1 i len1 i else if p j 1 else return dp len1 len2 原題鏈結 數學推導 找規律 class solution else if n 3 2 return ipow 3 numso...