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)) |
留言
張貼留言