給定乙個 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...