劍指offer 16.數值的整數次方


題目描述

給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。保證base和exponent不同時為0。

解題思路

  • 思考指數函數的定義
  1. 底數共有三種情形:
    (i) base > 1
    (ii) 0 < base < 1
    (iii) base < 0

  2. 底數為正數 (i)、(ii)
    考慮指數為正數以及負數的情形 => 使用 flag

  3. 底數為負數 (iii)
    考慮指數為正數以及負數的情形 => 使用 flag
    能否被2整除,若能被2整除,則為正數,若不能整除,則為負數 => 使用 pos

  4. 最終判定返回的數

  • flag 決定是否取倒數
  • pos 判定正負數

e.g. 底數為正,若 flag 為正數,則返回 ans => ans
e.g. 底數為正,若 flag 為負數,則返回 ans的倒數 => 1/ans
e.g. 底數為負,若flag為正,pos為正數,則返回 => ans
e.g. 底數為負,若flag為負,pos為正數,則返回 => 1/ans
e.g. 底數為負,若flag為正,pos為負數,則返回 => - ans
e.g. 底數為負,若flag為負,pos為負數,則返回 => - 1/ans

在这里插入图片描述

Python 代碼

將方法一思考簡化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Solution:
    def Power(self, base, exponent):
        """
        給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
        保證base和exponent不同時為0 (0的0次方無意義)
        """
        # write code here
        num = abs(base)
        ans = 1
        flag = True   # 判斷指數是否為正,正的話維持不變,負的話返回倒數
        pos = True    # 判斷底數是否為正,在指數為負的時候輔佐判斷
   
        if exponent == 0:
            if base != 0:
                return 1
        if base == 0:
            if exponent !=0:
                return 0
       
   
        for i in range(abs(exponent)):
            ans *=num
   
        if base > 1:
            if exponent < 0:
                flag = False
        elif 0 < base < 1:        
            if exponent <0:
                flag= False
        elif base <0:
            if exponent <0:
                flag = False
            if exponent % 2 !=0:
                pos = False
        else:
            pass
   
        # 最終透過 flag & pos 判斷
        if flag and pos:
            return ans
        elif flag and not pos:
            return -ans
        elif not flag and pos:
            return 1/ans
        else:
            return -1/ans

方法一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        """
        給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
        保證base和exponent不同時為0
        """
        # write code here
        # 0的0次方無意義
        num = abs(base)
        ans = 1
        if exponent == 0:
            if base != 0:
                return 1
        if base == 0:
            if exponent !=0:
                return 0
        else:

            for i in range(abs(exponent)):
                ans *=num

            if base > 1:
                if exponent > 0:
                    return ans
                else:
                    return 1/ans
            elif 0 < base < 1:
                if exponent >0:
                    return ans
                else:
                    return 1/ans
            elif -1 <base <0:
                print(base)
                if exponent >0:
                    if exponent %2 == 0:
                        return ans
                    else:
                        return -ans
                else:
                    if exponent %2 == 0:
                        return 1/ans
                    else:
                        return -1/ans
            elif base<= -1:
                if exponent >0:
                    if exponent %2 == 0:
                        return ans
                    else:
                        return -ans
                else:
                    if exponent %2 == 0:
                        return 1/ans
                    else:
                        return -1/ans
            else:
                pass