劍指offer 12 數值的整數次方

2021-10-19 07:25:05 字數 2316 閱讀 7520

12. 數值的整數次方

實現函式double power(double base, int exponent),求base的exponent次方。不得使用庫函式,同時不需要考慮大數問題。

示例 1:

輸入: 2.00000, 10

輸出: 1024.00000

示例 2:

輸入: 2.10000, 3

輸出: 9.26100

示例 3:

輸入: 2.00000, -2

輸出: 0.25000

解釋: 2-2 = 1/22 = 1/4 = 0.25

說明:

-100.0 < x < 100.0

n 是 32 位有符號整數,其數值範圍是 [−2

31
, 2
31
− 1] 。
0的任何次冪都是0, 非零整數的 0 次冪都是1, 整數的 負數次冪等於 整數的倒數的正數次冪,最後折半遞迴,判斷指數的 奇 偶,如果是奇數還要多乘乙個x

1 class solution 

6 // 遞迴

7 // 遞迴邊界是0

8 //long power = n;

9 if(n == 0)

12 if(n < 0)

15 16 // 折半遞迴

17 double temp = mypow(x, n/2);

18 temp *= temp;

19 if((n % 2) == 1)

22 return temp;

23 }

24 }

上面的程式其實是有問題的,因為n是int型別的,範圍是[-231, 231-1], 如果 n = -231, 那取反後就越界了,所以有兩種解決辦法,

① 一種是把 n 用乙個long變數存下來,這樣取反後就不會越界了, 只適用於非遞迴方式

② 另一種是在把n取反的時候1/x提取出來乙個, 這樣就不會越界了,

思路參考:

① 一種是把 n 用乙個long變數存下來

n = b0*20 + b1*21 + b2*22 + ... + bi*2i (bi=0/1), 只有bi等於1才對n的值有作用

n 有作用,因為x

0 = 1, 所以我們應該讓n不斷右移一位,等n的二進位制最後一位是1的時候,讓 res 乘上當前基數即可,如果n的二進位制位的最後一位是0,繼續計算當前位的基數,為後續做鋪墊。

1 class solution 

7 long power = n;

8 if(n < 0)

12 double res = 1.0, temp = x;

13 while(power != 0)

18 19 x = x * x;

20 power >>= 1;

21 }

22 return res;

23 }

24 }

② 另一種是在把n取反的時候1/x提取出來乙個

1 class solution 

6 // 遞迴,遞迴邊界是0

7 //long power = n;

8 if(n == 0)

11 if(n < 0)

14 15 // 折半遞迴

16 double temp = mypow(x, n/2);

17 temp *= temp;

18 if((n % 2) == 1)

21 return temp;

22 }

23 }

時間複雜度:折半求冪,所以時間複雜度為o(logn)

空間複雜度:遞迴方式下有個棧的空間複雜度,為o(logn), 非遞迴方式下空間複雜度為o(1)

劍指Offer (12)數值的整數次方

題目描述 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。實現如下 方法一 迴圈 此題不需要考慮計算後值溢位的情況,即不存在大數情況 異常情況 底數為0時 0.0 指數為0時 1.0 數學定義 指數為負數時,需要考慮先計算指數絕對值的結果...

劍指offer 12 數值的整數次方

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。1 對數字的預處理,比如,0的負數次方等 2 提高計算n的m次方的效率方法一 遞迴。利用公式 ab b 2 0 ab 2 ab 2 a b 1 2 a b 1 2 aclass soluti...

劍指Offer 12 數值的整數次方

description給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。用divide conquer的思路可以每次平方,最後堆起來得到答案。最開始的時候我搞不太清exp 0,1這種情況怎麼合併,所以就單獨分了出來。c double pow...