Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.95 KB | None | 0 0
  1. import traceback
  2. def math_eval(expression):
  3.     for j in range(len(expression)):
  4.         if expression[j]=="-":
  5.             if j>0:
  6.                 if expression[j-1] in "0123456789)":
  7.                     expression = expression[:j]+"~"+expression[j+1:]
  8.     operators = "^*/+~"
  9.     operator_groups = ["^", "*/", "+~"]
  10.     expression = expression.replace(" ","")
  11.     expression = expression.replace(",","")
  12.     for num in "0123456789":
  13.         expression = expression.replace(num+"(","%s*("%num)
  14.         expression = expression.replace(")"+num,")*%s"%num)
  15.     expression = expression.replace(")(",")*(")
  16.     while "(" in expression:
  17.         start = expression.find("(")
  18.         par_count = 0
  19.         end = 0
  20.         for i in range(start, len(expression)):
  21.             if expression[i]=="(":
  22.                 par_count+=1
  23.             elif expression[i]==")":
  24.                 par_count-=1
  25.             if par_count==0:
  26.                 end = i
  27.                 break
  28.         else:
  29.             raise SyntaxError
  30.         expression = expression.replace(expression[start:end+1], math_eval(expression[start+1:end]))
  31.     for oper_group in operator_groups:
  32.         while True:
  33.             for j in range(len(expression)):
  34.                 if expression[j]=="-":
  35.                     if j>0:
  36.                         if expression[j-1] in "0123456789)":
  37.                             expression = expression[:j]+"~"+expression[j+1:]
  38.  
  39.             for i in range(len(expression)):
  40.                 if expression[i] in oper_group:
  41.                     oper = expression[i]
  42.                     oper_i = i
  43.                     break
  44.             else:
  45.                 break
  46.             oper_i = expression.find(oper)
  47.             for i in range(oper_i-1, -1, -1):
  48.                 if expression[i] in operators:
  49.                     a = expression[i+1:oper_i]
  50.                     break
  51.             else:
  52.                 a = expression[:oper_i]
  53.             for i in range(oper_i+1, len(expression)):
  54.                 if expression[i] in operators:
  55.                     b = expression[oper_i+1:i]
  56.                     break
  57.             else:
  58.                 b = expression[oper_i+1:]
  59.             if oper=="^":
  60.                 expression = expression.replace(a+oper+b, "%.66f"%(float(a)**float(b)))
  61.             elif oper=="*":
  62.                 expression = expression.replace(a+oper+b, "%.66f"%(float(a)*float(b)))
  63.             elif oper=="/":
  64.                 assert b==0
  65.                 expression = expression.replace(a+oper+b, "%.66f"%(float(a)/float(b)))
  66.             elif oper=="+":
  67.                 expression = expression.replace(a+oper+b, "%.66f"%(float(a)+float(b)))
  68.             elif oper=="~":
  69.                 expression = expression.replace(a+oper+b, "%.66f"%(float(a)-float(b)))
  70.     return "%s"%float(expression)
  71. while 1:
  72.     try:
  73.         print float(math_eval(raw_input()))
  74.     except AssertionError:
  75.         print "Divide by 0"
  76.     except:
  77.         traceback.print_exc()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement