m0_74217538 2024-04-27 19:06 采纳率: 0%
浏览 6

CSP化学方程式测试点全过只有三十分

#CSP2019-12-3化学方程式,测试点全过的情况下只有三十分。

#include<bits/stdc++.h>
using namespace std;
struct Ti{//结构体里面包括一个待定字符串和数字。可以对标元素及其数量 
    string s0="";
    int count=0;//这个为多位数字到底是几位,像100,count为3,字母和符号都是0 
    int location=-1; 
    int sum=0;//这个是字母的个数; 
    int flag=0;
    int bracketflag=0;
    int bracketflag1=0; 
};
int getCharacter(struct Ti ti[],int size){//获取等号 
    for(int i=0;i<size;i++){
        if(ti[i].s0[0]=='=') return i;
    }
}
void numchange(struct Ti ti[],int size){//数字转化函数 
    for(int i=0;i<=size;i++){
        int s=0;
        if(ti[i].count>0){
        for (int j = 0; j < ti[i].count; j++) {
        int s01=ti[i].s0[j];
        s01-='0';
        s+=s01*pow(10,ti[i].count-j-1);   
        }
     ti[i].count = s; 
    }    
}
}
void getFirst(struct Ti ti[],int size,int flag0){//系数处理函数 
    int t=0; int p=0;
    for(int i=0;i<=size;i++){
        if(ti[0].count>0){
//            cout<<ti[i].flag<<endl;
            if(ti[i].flag==1) t=1;
            if(t==0){
                if(ti[i].sum==1) {
                ti[i].sum*=ti[0].count;
                }    
            }
        }
        else if(ti[i].flag==1){
//            cout<<ti[i].flag<<endl;
            t=1;
        }
//        cout<<t<<endl; 
//        if(t>0) cout<<" 执行0"<<endl;
        if(t>0&&t<=flag0&&ti[i].flag==t){
//            cout<<t<<endl;
            p=i+1;t++;
        }
        if(ti[p].count>0){
            if(ti[i].sum==1){
                ti[i].sum*=ti[p].count;    
            }
        }
    }
}
void getbehind(struct Ti ti[],int size){//处理单一元素后面的数字(即该数字只表示一个元素的数值) 
    for(int i=0;i<=size;i++){
        if(ti[i].count>0&&ti[i-1].sum>0){
            ti[i-1].sum*=ti[i].count;
        } 
    }
}
void getbracketbehind(struct Ti ti[],int size,int bracketflag0){ //如  (Au(CN)2)
    int p=1,t=1;
    for(int i=size;i>0;i--){
        if(ti[i].count>0&&ti[i-1].bracketflag1==1){
             t=ti[i].count;p*=t;
        }
        if(p>1&&ti[i].sum>0) ti[i].sum*=p;
        if(ti[i].bracketflag1==-1){
            p/=t;
            for(int j=i;j<size;j++){
                if(ti[j].bracketflag1==1&&ti[j].bracketflag==ti[i].bracketflag+2&&ti[j+1].count>1){
                    t=ti[j+1].count;break;
                }
            }
        }        
    }
}
bool statistics(struct Ti ti[],int size){
    int f=0;
    int isolation=getCharacter(ti,size);
//    cout<<isolation<<endl;
    for (int i=0;i<isolation;i++){
         if(ti[i].sum>0){
             for(int j=i+1;j<isolation;j++){
                 if(ti[j].s0[0]==ti[i].s0[0]){
                     if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){
//                         cout<<"true"<<" "<<j<<" "<<i<<" "<<ti[j].sum<<" "<<ti[i].sum<<" "<<ti[j].s0[1]<<" "<<ti[i].s0[1]<<endl;
                         ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                     }
                    if((ti[j].s0[1]<'a'||ti[j].s0[1]>'z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){
                        ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                    }
                 }
             }
         }
    } 
    for(int i=isolation+1;i<=size;i++){
          if(ti[i].sum>0){
             for(int j=i+1;j<=size;j++){
                 if(ti[j].s0[0]==ti[i].s0[0]){
                     if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){
//                         cout<<"true"<<" "<<j<<" "<<i<<" "<<ti[j].sum<<" "<<ti[i].sum<<" "<<ti[j].s0[1]<<" "<<ti[i].s0[1]<<endl;
                         ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                     }
                    if((ti[j].s0[1]<='a'||ti[j].s0[1]>='z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){
                        ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                    }
                 }
             }
         }    
    }
     for(int i=0;i<isolation;i++){
             if(ti[i].sum>0){
                 for(int j=isolation+1;j<=size;j++){
                     if(ti[i].sum>0){
                         if(ti[j].s0[0]==ti[i].s0[0]){
                            if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){
                                 if(ti[i].sum!=ti[j].sum) f++;
                                 ti[i].sum=0;ti[j].sum=0;
                           }
                           if((ti[j].s0[1]<'a'||ti[j].s0[1]>'z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){
                                if(ti[i].sum!=ti[j].sum) f++;
                                ti[i].sum=0;ti[j].sum=0;
                          }
                     }
                         
                     }
               }
             }
         }    
         for(int i=0;i<=size;i++){
             if(ti[i].sum>0) f++;
         }
         if(f==0) return true;
         else return false;
}
int main(){
    int n;cin>>n;string s;
    for(int i=0;i<n;i++){
        cin>>s;Ti ti[1000];int ti0=0;int flag0=0;int bracketflag0=0;int z=0;
        for(int j=0;j<s.length();j++){ 
        //存储函数,多位数字的location显示的是最右边数字的位置,大小写元素的位置显示的是大写字母位置,也就是前端位置
            if(s[j]=='+'||s[j]=='='||s[j]=='('||s[j]==')'){
                if(s[j-1]>='0'&&s[j-1]<='9') ti0++;
                if(s[j]=='+'||s[j]=='=') {
                    if((s[j]=='+'&&s[j+1]=='+')||(s[j]=='='&&s[j+1]=='=') ) z++;
                    flag0++;ti[ti0].flag=flag0;
                }
                if(s[j]=='('||s[j]==')') {
                    bracketflag0++;ti[ti0].bracketflag=bracketflag0;
                    if(s[j]=='(') ti[ti0].bracketflag1=-1;
                    if(s[j]==')') ti[ti0].bracketflag1=1;
                }
                ti[ti0].s0+=s[j];
                ti[ti0].location=j;
                ti0++;
            }
            if(s[j]>='A'&&s[j]<='Z'){
                if(s[j-1]>='0'&&s[j-1]<='9') ti0++;
                ti[ti0].s0+=s[j];
                if(s[j+1]>='a'&&s[j+1]<='z'){ti[ti0].s0+=s[j+1];}
                ti[ti0].location=j;ti[ti0].sum=1;
                if(j!=s.length()-1) ti0++;
                if((s[j+1]>='a'&&s[j+1]<='z')&&j==s.length()-2)ti0--;
            }
            if(s[j]>='0'&&s[j]<='9'){
                ti[ti0].s0+=s[j];    
                ti[ti0].location=j;//这个j应该是右值位置 
                ti[ti0].count++;
            }
        }
        numchange(ti,ti0);
        getFirst(ti,ti0,flag0);
        getbehind(ti,ti0); 
        getbracketbehind(ti,ti0,bracketflag0);
        bool f=statistics(ti,ti0);
//        for(int i0=0;i0<=ti0;i0++){
//                cout<<ti[i0].s0<<" "<<ti[i0].count<<" "<<"  "<<ti[i0].sum<<" "<<ti[i0].flag<<" "<<ti[i0].bracketflag<<" "<<ti[i0].location<<endl;
//            }
        if(z>0) f=false;
        if(f==true) cout<<"Y"<<endl;
        else cout<<"N"<<endl;
    } 
    return 0;
}

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2024-04-27 19:06
    关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    问题分析:

    该代码是用来处理化学方程式的,但在测试点全过的情况下只有三十分。先对代码进行简单的修改和调试,发现该代码存在以下问题:

    • 数字转化函数在处理系数时出错;
    • 处理单一元素后面的数字(即该数字只表示一个元素的数值)时没有判断是否为单一元素;
    • 处理(Au(CN)2)等括号式子中,括号后面的数字的时候存在错误;
    • 没有统计相同元素的个数。

    解决方案:

    • 修改数字转化函数

    将数字转化函数进行修改,保证在给定的系数是多位数时能够正确将该数字转化为整数:

    void numchange(struct Ti ti[],int size){//数字转化函数 for(int i=0;i<=size;i++){ int s=0; if(ti[i].count>0){ for (int j = 0; j < ti[i].count; j++) { int s01=ti[i].s0[j]; s01-='0'; s += s01 * pow(10, ti[i].count-j-1);
    } ti[i].count = s; }
    } }

    • 处理单一元素后面的数字

    在getbehind函数中修改,增加对是否为单一元素的判断:

    void getbehind(struct Ti ti[], int size){//处理单一元素后面的数字(即该数字只表示一个元素的数值) for(int i=1; i<=size; i++){ if(ti[i].count>0 && ti[i-1].sum==1 && ti[i].sum==0){ ti[i-1].sum *= ti[i].count; ti[i].count = 0; } } }

    • 处理(Au(CN)2)等括号式子中,括号后面的数字

    getbracketbehind函数中修改,保证在统计过括号中的元素数量之后再乘上括号后面的数字:

    void getbracketbehind(struct Ti ti[], int size, int bracketflag0){ //如 (Au(CN)2) int p = 1, t = 1; for(int i=size; i>0; i--){ if(ti[i].count>0 && ti[i-1].bracketflag1==1){ t = ti[i].count; p *= t; } if(p>1 && ti[i].sum>0){ ti[i].sum *= p; } if(ti[i].bracketflag1==-1){ p /= t; for(int j=i; j<size; j++){ if(ti[j].bracketflag1==1 && ti[j].bracketflag==ti[i].bracketflag+2 && ti[j+1].count>0){ t=ti[j+1].count; break; } } }
    } }

    • 统计相同元素的个数

    增加statistics函数,统计相同元素的个数,并在之前的函数中复用该函数:

    bool statistics(struct Ti ti[], int size){//统计相同元素的个数 int f = 0; int isolation = getCharacter(ti, size); for(int i=0; i<isolation; i++){ if(ti[i].sum>0){ for(int j=i+1; j<isolation; j++){ if(ti[j].s0[0]==ti[i].s0[0]){ if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){ ti[i].sum += ti[j].sum; ti[j].sum = 0; } if((ti[j].s0[1]<'a'||ti[j].s0[1]>'z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){ ti[i].sum += ti[j].sum; ti[j].sum = 0; } } } } } for(int i=isolation+1; i<=size; i++){ if(ti[i].sum>0){ for(int j=i+1; j<=size; j++){ if(ti[j].s0[0]==ti[i].s0[0]){ if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){ ti[i].sum += ti[j].sum; ti[j].sum = 0; } if((ti[j].s0[1]<'a'||ti[j].s0[1]>'z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){ ti[i].sum += ti[j].sum; ti[j].sum = 0; } } } }
    } for(int i=0; i<isolation; i++){ if(ti[i].sum>0){ for(int j=isolation+1; j<=size; j++){ if(ti[i].sum>0){ if(ti[j].s0[0]==ti[i].s0[0]){ if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){ ti[i].sum += ti[j].sum; ti[j].sum = 0; } if((ti[j].s0[1]<'a'||ti[j].s0[1]>'z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){ ti[i].sum += ti[j].sum; ti[j].sum = 0; } } } } }
    } bool flag = 0; for(int i=0; i<=size; i++){ if(ti[i].sum!=0){ flag = 1; break; } } return flag; }

    完整代码:

    评论

报告相同问题?

问题事件

  • 创建了问题 4月27日