题解 | #四则运算#
四则运算
http://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
不用python自带函数,硬解。 思路如下:先把括号处理了,全部变成(),然后处理掉所有的括号,计算主要有两个函数,一个是djisuan,功能是计算无括号的算式,例如 3+7 * 9返回结果66 同样可以计算类似于不加括号且有正负的算式例如 -4+5--6返回结果7。 该函数思路是分离符号和数字,难处理的就是中间的正负号,例如-4+5--6* 3 * 3,分离之后对应到两个list a=[-4,5,6,3,3]和b=['+','+',' * ',' * '],然后遍历b,记录n个乘除,然后循环n次遍历b取优先级高的符号先计算,然后用结果替代算掉的数字和删除符号。如上例,遍历一次,记录n=2,循环遍历2次,先算6 * 3,遍历一次结果 b=['+','+',' * '],a=[-4,5,18,3],然后再遍历一次,处理完所有的乘除之后,直接按从左到右顺序计算,最后返回结果。 另一个函数是get_first_jisuan,功能是处理掉第一个需要计算的括号例如1+(7+(2+8)+12) 返回 1+(7+10+12),该函数先正向遍历找到第一个),break。再从第一个)位置,反向遍历,记录所有字符,直到碰到(,将字符取出来,构成字符串,然后字符串反转,调用djisuan函数,输入该字符串,算出结果,将结果代替反向遍历碰到的(,删除取出来的字符和找到的第一个)。例如第一个例子,先拿出8+2,反转成2+8,计算出等于10,用10取代(,删除2+8),于是得到1+(7+10+12)。反复调用get_first_jisuan,就可以把所有的括号全部处理了。最后只剩无括号算式,直接调用djisuan,算出结果。
n=input()
#处理括号
def kuohao(s):
sn=''
for i in s:
if (i == '[') or (i=='{'):
sn+='('
elif (i == ']') or (i=='}'):
sn+=')'
else:
sn+=i
return sn
#无括号算式计算
def djisuan(a):
f=[]
num=[]
x=''
n=0
m=0
for i in range(0,len(a)):
if i==0:
x+=a[i]
else:
if a[i] not in ['-','+','/','*']:
x+=a[i]
if i==len(a)-1:
num.append(float(x))
elif a[i] in ['*','/']:
f.append(a[i])
num.append(float(x))
x=''
else:
if (a[i-1] not in ['-','+','/','*']):
f.append(a[i])
num.append(float(x))
x=''
elif a[i]=='-':
m=m+1
if a[i+1] not in ['-','+']:
if m%2==0:
x=x+'+'
m=0
else:
x=x+'-'
m=0
for i in f:
if i=='*' or i=='/':
n+=1
for i in range(0,n):
for j in range(0,len(f)):
if f[j]=='*':
xin=num[j]
yin=num[j+1]
opr=xin*yin
num[j]=opr
del(num[j+1])
del(f[j])
break
if f[j]=='/':
xin=num[j]
yin=num[j+1]
opr=xin/yin
num[j]=opr
del(num[j+1])
del(f[j])
break
for i in range(0,len(f)):
for j in range(0,len(f)):
if f[j] =='+':
xin=num[j]
yin=num[j+1]
opr=xin+yin
# print(opr)
num[j]=opr
del(num[j+1])
del(f[j])
break
else:
xin=num[j]
yin=num[j+1]
opr=xin-yin
# print(opr)
num[j]=opr
del(num[j+1])
del(f[j])
break
return num[0]
#从算式中找到第一需要计算的括号,并计算出来,用结果代替括号内容,如3+(5+(6+10)) 变成 3+(5+16)
def get_first_jisuan(a):
s=''
jl=0
jl_=0
for i in range(0,len(a)):
if a[i]==')':
jl=i
for j in range(i-1,-1,-1):
if a[j]!='(':
s+=a[j]
elif a[j]=='(':
jl_=j
break
break
s=s[::-1]
x=djisuan(s)
s=''
for i in range(0,jl_):
s+=a[i]
s+=str(x)
for i in range(jl+1,len( a )):
s+=a[i]
return s
n=kuohao(n)
asd=0
for i in n:
if i=='(':
asd+=1
for i in range(0,asd):
n=get_first_jisuan(n)
print(int(djisuan(n)))