摘要:简单化学方程式的原子守恒判断,用类似处理算术表达式的方式处理一遍.代码中输出格式要去掉多余部分(交了两次0分很疑惑 最后发现格式不对)

题目见 https://blog.csdn.net/wingrez/article/details/103551680

思路:刚开始一直在想一个比较合理的办法,但是一直没有想到合适的最后还是直接一个一个字符的处理.处理的时候每次处理一种元素以及它的原子个数分别由getnumber和getele完成;对于括号的处理用了递归的方式处理.

定义了EEE结构体表示一个化合物的元素构成,简单定义了加法和乘法来对原子数的运算;

整体来说就说模拟了一遍计算表达式的计算,只不过数变成了化学式子.

#include "bits/stdc++.h"
#include <cstring>
#include <cstdlib>
#include <cstdio>
#define mk(a,b) make_pair(a,b)
using namespace std;
#define M 1003
/* in
11
H2+O2=H2O
2H2+O2=2H2O
H2+Cl2=2NaCl
H2+Cl2=2HCl
CH4+2O2=CO2+2H2O
CaCl2+2AgNO3=Ca(NO3)2+2AgCl
3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2
3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH
Cu+As=Cs+Au>>
N
Y
N
Y
Y
Y
Y
Y
Y
Y
N
*/struct EEE{map<string,int> e;void re_ele(string ele,int cnt=1){e.clear();e[ele]=cnt;}void add(string ele,int cnt=1){EEE te;te.re_ele(ele,cnt);*this+te;}EEE operator *(int b){for(auto it=e.begin();it!=e.end();it++){it->second=it->second*b;}return *this;}EEE operator+(EEE &b){for(auto it=b.e.begin();it!=b.e.end();it++){auto i=e.find(it->first);if(i!=e.end()){i->second+=it->second;}else{e[it->first]=it->second;}}return *this;}
};
int getnumber(char *&p){int cnt=-1;if(isdigit(*p)){cnt=*p-'0';p++;while(isdigit(*p)){cnt=cnt*10+*p-'0';p++;}}return cnt;
}
string getele(char *&p){string ele="#";if(isupper(*p)){ele="";ele+=*p;p++;if(islower(*p)){ele+=*p;p++;}}return ele;
}
void showE(EEE &t){for(auto &i:t.e){cout<<i.first<<i.second<<endl;}cout<<endl;
}
EEE itemdis(char *&s){//cout<<s<<endl;EEE re,te;string ele="#";int cnt,tn;cnt=getnumber(s);while(*s!='\0'){if(*s=='('){s++;EEE te=itemdis(s);tn=getnumber(s);if(tn>0)te*tn;re+te;}else if(*s==')'){s++;return re;}else {ele=getele(s);tn=getnumber(s);if(tn==-1)tn=1;re.add(ele,tn);}}if(cnt>0)re*cnt;// showE(re);return re;}
void eqcount(EEE &e,char *s){char *p=s;EEE te;while(p=strchr(s,'+')){*p='\0';p++;te=itemdis(s);e+te;s=p;}te=itemdis(s);e+te;}
void eqcheck(EEE &l,EEE &r){// showE(l),showE(r);cout<<"ans:";bool ans = true;if(l.e.size()!=r.e.size()) ans=false;if(ans){for(auto ita=l.e.begin(),itb=r.e.begin();ita!=l.e.end();ita++,itb++){if(ita->first!=itb->first || ita->second!=itb->second){ans = false;break;}}}printf("%c\n",ans?'Y':'N');}void solve(){
/*
化学方程式 原子守恒检验
*/int cnt;
char eqstr[M],*pl,*pr;
cin>>cnt;while(cnt--){scanf("%s",eqstr);pl=eqstr;pr=strchr(eqstr,'=');*pr='\0';pr++;EEE l,r;eqcount(l,pl);eqcount(r,pr);eqcheck(l,r);
}}int main()
{freopen("in","r",stdin);//freopen("out","w",stdout);solve();return 0;
}

CSP201912-3 化学方程式相关推荐

  1. 化学方程式作评、数学上成知识百科……那些“别人家的老师”有何特别?

    懂化学的网友一定知道,上面的两张图是化学方程式,可你知道吗?它不仅是一个方程式,还是一个老师对学生的品评. 近日,浙江金华宾虹中学一位化学老师吕沆菲,给同学用化学方程式作评,并对每个方程式做了解读,和 ...

  2. c语言判断化学方程式,下列是某同学写的六个化学方程式:①Mg+O2点燃.MgO2②C+O2点燃.CO...

    化学方程式是最重要的化学语言,正确.熟练地书写化学方程式是学习化学必需具备的重要基本功. 怎样书写化学方程式? 1.要遵循两个基本原则 (1)以客观事实为基础 化学方程式既然是化学反应的表达形式,显然 ...

  3. 有机物燃烧的化学方程式配平(洛谷P1994题题解,Java语言描述)

    题目要求 P1994题目链接 分析 我太菜了,亏得我高中时期还虐(or被虐)生化,如今多年过去竟然没分析出来坑点,我太菜了. 我开始盲目认为"元素守恒",所以对HHH原子数求和, ...

  4. crout分解计算例题_专题:化学方程式计算

    一. 根据化学方程式的简单计算 (1) 根据化学方程式计算的依据 化学方程式表达的信息之一是反应物与生成物之间在"遵循固定质量比"的前提下的质量守恒.根据这一信息,可以利用化学方程 ...

  5. CCF201912-3 化学方程式(100分)【文本处理】

    试题编号: 201912-3 试题名称: 化学方程式 时间限制: 1.0s 内存限制: 512.0MB 问题链接:CCF201912-3 化学方程式 问题简述:(略) 问题分析:文本处理问题,按字符串 ...

  6. CSP化学方程式题解

    CSP化学方程式题解 题目描述 题目分析 本题主要考察栈的应用(也可以采用递归的方式,效率低),是一道与编译原理相关的题目. 首先我采用的是类似于哈希表的方法存储的元素位置及其数量,当然也可以用stl ...

  7. Python趣用—配平化学方程式

    不知不觉已经毕业多年了,不知道大家是否还记得怎么配平化学方程式呢?反正小编我是已经记不太清了,所以今天的文章除了分享如何用python配平化学方程式,顺带着还会复习一些化学方程式的知识,希望广大化学爱 ...

  8. CCF201912-3 化学方程式*

    参考 https://blog.csdn.net/wingrez/article/details/85111975 https://blog.csdn.net/richenyunqi/article/ ...

  9. PTA Easy chemistry 化学方程式等价判定 string 状态机

    7-5 Easy chemistry In this question, you need to write a simple program to determine if the given ch ...

  10. markdown化学方程式

    之前讲了markdown化学表达式,接下来我来讲讲如何用markdown写化学方程式. $2KMnO_4 \stackrel{\Delta}{=\!=\!=} K_2MnO_4 + MnO_2 + O ...

最新文章

  1. showModalDialog 传值及刷新
  2. 微软低调发布 Web 版本的 Visual Studio Code 预览
  3. shell整理(41)====判断输入是不是ip
  4. 200725学习日报循环语句和数组
  5. 关于keil编译cortex-m3纯汇编时为什么问题使用align地址问题
  6. Java 8 Friday:让我们弃用那些旧版库
  7. 录制电脑屏幕的软件_电脑屏幕录制操作方法,太实用了!
  8. 如何动态获取UILabel的高度、宽度
  9. 深信服智安全 SCSA---1
  10. 卡牌大师怎么玩_LOL卡牌大师技巧 卡牌大师攻略
  11. 异常值监测的方法 Tukey test
  12. linux 蓝牙驱动
  13. 管中窥豹之淘宝大数据平台
  14. Android开发最新所有框架总结排行榜
  15. 请问一下Android Studio如何配置JAVACV 0.8Javacv+2.4.9Opencv 万分感谢
  16. Word使用中遇到的一些错误与解决办法,附2016版本office的安装方法
  17. Java——文本框设置背景颜色、字体样式和颜色
  18. 4.外部协作单位的组织与管理
  19. 操作系统--时间片轮转调度算法(RR算法)
  20. 【CCF】ISBN号码

热门文章

  1. Soild性能居然这么厉害,Vue、React和Angular竟纷纷跌出前十
  2. Android游戏《UP住模拟器》开发日志:手机线性马达的调教
  3. 不登QQ时就不启动腾讯QPCore服务
  4. 电阻式触摸屏的驱动程序和详细注释
  5. [文萃画材·油画]芭蕾舞女梦幻而绝美
  6. 好用的电容笔有哪些推荐?性价比高的触控笔
  7. 中兴oltc320用户手册_中兴C320C300 V2版本OLT开局配置手册
  8. 什么是linux进程的挂起,linux挂起进程命令
  9. gdb 的用法(Linux调试器)
  10. 4、ESP32-S - 连接 WiFi