题解 | #四则运算#

四则运算

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)))
全部评论
兄弟,你是不是太闲了
点赞 回复 分享
发布于 2022-02-12 15:32

相关推荐

04-17 18:32
门头沟学院 Java
野猪不是猪🐗:他跟你一个学校,你要是进来之后待遇比他好,他受得了?
点赞 评论 收藏
分享
04-25 18:13
五邑大学 Java
无面如何呢:用心包装一下自己的实习
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务