Zerojudge 基礎題庫a017 五則運算(Python)


只要有碰到字串的題目,都麻煩死了...

這題我做了5個小時,感覺自己在搞混自己,幸好,最後debug出來了

這題有兩個思維我想說,一個是括號,另一個是先乘除後加減。

1.括號

括號是一個棘手的題目,因為一題可能有兩個以上括號,還有可能括中括
那怎麼辦? 舉一個例子好了:

(( 1 + 2 ) + ( 3 + 4 )) + 5

先找最右邊的 '('  :
(( 1 + 2 ) + ( 3 + 4 )) + 5
然後找她右邊的第一個 ')'  :
(( 1 + 2 ) + ( 3 + 4 )) + 5
再來我們把()中間的東西運算好,整個替代 ( 3 + 4 )
(( 1 + 2 ) + 7) + 5
然後一直重複以下步驟,一直到沒有括號

(( 1 + 2 ) + ( 3 + 4 )) + 5

(( 1 + 2 ) + 7 ) + 5

( 3 + 7 ) + 5

10 + 5

最後再計算一次就行了~

2.先乘除後加減

首先,我們只合併 * / % 這些符號

最後,再合併 + - 這些符號

例如: 

2 * 3 + 10 / 5 - 3 % 2

我們先看 * / % 

2 * 3 + 10 / 5 - 3 % 2
6 + 10 / 5 - 3 % 2
6 + 2 - 3 % 2
6 + 2 - 1

再看 + -
6 + 2 - 1
8 - 1
7

提示就這些,剩下的自己練習吧

3.程式碼:


  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
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
def find_brackets(list1):
    '''回傳 "(" 和 ")" 的位置,兩個串列'''
    first_list = []
    last_list = []
    for i in range(len(list1)):
        if list1[i] == '(':
            first_list.append(i)
    for j in range(len(list1)):
        if list1[j] == ')':
            last_list.append(j)
    return first_list, last_list


def pair_brackets(list1, list2):
    ''' 回傳一個串列,內容是最後一個"("到下一個")" alpha版'''
    pairs = []
    counter = 1
    listA = list1
    listB = list2
    listA.reverse()
    for i in listA:
        for j in listB:
            if i < j:
                middle = [i, j]
                pairs = middle
                listB.remove(j)
                counter+=1
                break
        if counter >= 1:
            break    
        
    return pairs
def pair(list1):
    '''回傳一個串列,內容是最後一個"("到下一個")"'''
    x, y = find_brackets(list1)
    return pair_brackets(x, y)

def calculator(num1, cal, num2):
    '''一個符號計算機'''
    x = int(num1)
    y = int(num2)
    letter = cal

    if letter == '+':
        return x + y
    elif letter == '-':
        return x - y
    elif letter == '*':
        return x * y
    elif letter == '/':
        return x // y
    elif letter == '%':
        return x % y


def muti_cal(list1):
    '''多重計算機(無括號),回傳串列'''
    process = list1
    # 處理 * / %
    while 1:
        for i in range(len(process) - 1):  # 0 ~ list1's length - 2
            if process[i] == '*' or process[i] == '/' or process[i] == '%':
                process.insert(
                    i - 1, calculator(process[i-1], process[i], process[i+1]))
                process[i:i+3] = []
                # print(process)
                break
        else:
            break
    # 處理 + -
    while 1:
        for i in range(len(process) - 1):  # 0 ~ list1's length - 2
            if process[i] == '+' or process[i] == '-':
                process.insert(
                    i - 1, calculator(process[i-1], process[i], process[i+1]))
                process[i:i+3] = []
                # print(process)
                break
        else:
            break

    return process
  

def merge(list1):
    list_question = list1
    pair_list = pair(list_question)
    #print(pair_list)
    #print(list_question[pair_list[0] + 1 : pair_list[1]])
    if pair_list == []:
        return None
    list_question[pair_list[0] : pair_list[1] + 1] = muti_cal(list_question[pair_list[0] + 1 : pair_list[1]])
    #print(list_question)
    return list_question
    

def ans(list1):
    wanna = list1
    
    while merge(wanna) != None:
        merge(wanna)
        #print(wanna)
    if len(wanna) != 1:
        return muti_cal(wanna)[0]
    return wanna[0]



while 1:
    try:
        q = input()
    except:
        break
    get = q.split()
    #print(ans(get))
    print(ans(get))

















留言

這個網誌中的熱門文章

Zerojudge 基礎題庫a004 文文的求婚 (Python)

紙蜻蜓的受風面積與紙蜻蜓落地時間的關係 #1 [實驗歷程與Python Matplotlib]

Zerojudge 基礎題庫a013 羅馬數字 (Python)