CSP 201912-3 化学方程式(python)

文章目录

  • 题目
  • 考场代码
  • 结果
  • 修正代码(20-3-6)

题目


这题是一道典型的字符处理题,比较复杂,但题目中给出的巴科斯范式是一个提示,可以让你快速理清代码思路。但是本人在考场上时直接忽略这部分范式,以为是废话。。。。
所以看完题目就直接开干,最后花了两个多小时才写出来。。。看完这题时,很明显处理括号是需要递归分析的。想明白这个基本就能开写了。由于用的是python,很容易就超时,所以最后只拿到70分。

考场代码

n =int(input())
shi=[]
for i in range(n):
    shi.append(input())
def chu1(item,m):
    res={}
    i=0
    s=""
    num=""
    while(i<len(item)):
        if item[i]=='(':
            p=1
            for j in range(len(item)):
                if item[j]=='(':
                    p+=1
                elif item[j]==')':
                    p-=1
                    index=j
                if p==0:
                    break
            k=i+1
            i=index
            if i<len(item)-1 and 48<=ord(item[i+1])<=57:
                num+=item[i+1]
                i+=1
                while i<len(item)-1 and 48<=ord(item[i+1])<=57:
                    num+=item[i+1]
                    i+=1
            if num=="":
                re=chu1(item[k:index],1*m)
            else:
                re=chu1(item[k:index],int(num)*m)
            for key in re:
                res[key]=res.get(key,0)+re[key]
        elif 65<=ord(item[i])<=90:
            s+=item[i]
            if i<len(item)-1 and 97<=ord(item[i+1])<=122:
                s+=item[i+1]
                i+=1
            if i<len(item)-1 and 48<=ord(item[i+1])<=57:
                num+=item[i+1]
                i+=1
                while(i+1<len(item) and 48<=ord(item[i+1])<=57):
                    num+=item[i+1]
                    i+=1
            if num=='':
                res[s]=res.get(s,0)+m
            else:
                res[s]=res.get(s,0)+m*int(num)
            num=""
            s=""
        i+=1
    return res
def chu(x):
    huashi=x.split('+')
    res={}
    for item in huashi:
        i=0
        num=""
        if 48<=ord(item[i])<=57:
            num+=item[i]
            i+=1
            while(i<len(item)-1 and 48<=ord(item[i])<=57):
                num+=item[i]
                i+=1
        if num=="":
            re=chu1(item[i:],1)
        else:
            re=chu1(item[i:],int(num))
        for key in re:
            res[key]=res.get(key,0)+re[key]
    return res                    
for item in shi:
    sr=item.split('=')
    left,right=sr[0],sr[1]
    re1=chu(left)
    re2=chu(right)
    if re1==re2:
        print('Y')
    else:
        print('N')
    

结果

在这里插入图片描述

修正代码(20-3-6)

感谢网友的指正,之前一直懒得修改,以为自己肯定是正确的,没想到确实是犯了低级的错误,上面的代码中13行忘了j的起始位置了,改为for j in range(i+1,len(item)):,还有50,51行多缩进一下,应该删除一个缩进。这样就满分了,现在想想挺可惜的,主要还是自己功夫不到位,考场上时间紧张太粗心了。

n =int(input())
shi=[]
for i in range(n):
    shi.append(input())
def chu1(item,m):
    res={}
    i=0
    s=""
    num=""
    while(i<len(item)):
        if item[i]=='(':
            p=1
            for j in range(i+1,len(item)):
                if item[j]=='(':
                    p+=1
                elif item[j]==')':
                    p-=1
                    index=j
                if p==0:
                    break
            k=i+1
            i=index
            if i<len(item)-1 and 48<=ord(item[i+1])<=57:
                num+=item[i+1]
                i+=1
                while i<len(item)-1 and 48<=ord(item[i+1])<=57:
                    num+=item[i+1]
                    i+=1
            if num=="":
                re=chu1(item[k:index],1*m)
            else:
                re=chu1(item[k:index],int(num)*m)
            for key in re:
                res[key]=res.get(key,0)+re[key]
        elif 65<=ord(item[i])<=90:
            s+=item[i]
            if i<len(item)-1 and 97<=ord(item[i+1])<=122:
                s+=item[i+1]
                i+=1
            if i<len(item)-1 and 48<=ord(item[i+1])<=57:
                num+=item[i+1]
                i+=1
                while(i+1<len(item) and 48<=ord(item[i+1])<=57):
                    num+=item[i+1]
                    i+=1
            if num=='':
                res[s]=res.get(s,0)+m
            else:
                res[s]=res.get(s,0)+m*int(num)
        num=""
        s=""
        i+=1
    return res
def chu(x):
    huashi=x.split('+')
    res={}
    for item in huashi:
        i=0
        num=""
        if 48<=ord(item[i])<=57:
            num+=item[i]
            i+=1
            while(i<len(item)-1 and 48<=ord(item[i])<=57):
                num+=item[i]
                i+=1
        if num=="":
            re=chu1(item[i:],1)
        else:
            re=chu1(item[i:],int(num))
        for key in re:
            res[key]=res.get(key,0)+re[key]
    return res                    
for item in shi:
    sr=item.split('=')
    left,right=sr[0],sr[1]
    re1=chu(left)
    re2=chu(right)
    if re1==re2:
        print('Y')
    else:
        print('N')
    

在这里插入图片描述

你可能感兴趣的:(CSP)