【化学】 相对分子质量 简单题解

  • 思路
  • 代码

本蒟蒻写的第一道大模拟题( 我们机房某巨佬说是中模拟)

我:“ A了这道题,妈妈再也不同担心我算不对相对分子质量啦~ ”

思路

做这种模拟题时,需要一个明确的思路和分块意识。

我们在开始之前,先来研究一下这些化学式。

这些化学式,由小括号,大括号,下划线,数字,化学元素组成。

看到这些,是不是觉得无从下手?是不是尝试去实现了但是实现不了?

别着急,慢慢来。

我们先讨论单个的元素。eg:Ag,CuAg,CuAg,Cu

对于单个的元素,我们只需要预先将这些元素与他们的相对原子质量存好,用的时候调出来就可以了。对于这个,我们可以用一个map实现(STL大法好)。
更具体的,map应该这样定义:map<string,double> (具体的待会可以看看代码)

好,单个元素讲完了,现在我们来讨论没有原子团且有一个元素有下标的化学物质。 eg:CO2,Na2SO4CO_2,Na_2SO_4CO2​,Na2​SO4​

首先,我们需要一个 iii 游标来确定现在正在读的字符位置, lastlastlast 来记录上一个元素的相对原子质量。

接下来,如果检测到元素,并且该元素的下一位不是下划线,答案加上该元素的相对原子质量。否则启动 last 记录当前读入元素的相对原子质量。

有下标的化学元素解决啦,下面开始讨论带有原子团的化学式。

哎,带有小括号的喔,怎么玩啊?(之前就是在这里卡了半天)

别慌,我们来试着把整个化学式括起来。

这个时候我们可以很容易的发现,对于带括号的,我们只需要单独解决括号里面的内容就行了。怎么解决?当然是递归啦~。因为括号里面的内容都还是原子团或者化学式。

最后剩下的是带水的化学式,我们单独处理它。首先读入的时候寻找水分子连接符 “~” ,再将它后面的数字读入就可以了,如果没有数字,默认为 1 。

友情提示:建议除了游标使用整型变量,其他的运算都要用 double 类型。

代码

接下来是大家最喜欢的代码~

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#define ll long long
using namespace std;map<string,double> app;double ans;string elememts[26]={"H","C","N","O","F","Na","Mg","Al","Si","P","S","Cl","K","Ca","Mn","Fe","Cu","Zn","Ag","I","Ba","Hf","Pt","Au","Hg"};
string s;void init_elements()
{for(int i=0;i<25;++i)  //这样有点小麻烦了{if(i==0) app[elememts[i]]=1;if(i==1) app[elememts[i]]=12;if(i==2) app[elememts[i]]=14;if(i==3) app[elememts[i]]=16;if(i==4) app[elememts[i]]=19;if(i==5) app[elememts[i]]=23;if(i==6) app[elememts[i]]=24;if(i==7) app[elememts[i]]=27;if(i==8) app[elememts[i]]=28;if(i==9) app[elememts[i]]=31;if(i==10) app[elememts[i]]=32;if(i==11) app[elememts[i]]=35.5;if(i==12) app[elememts[i]]=39;if(i==13) app[elememts[i]]=40;if(i==14) app[elememts[i]]=55;if(i==15) app[elememts[i]]=56;if(i==16) app[elememts[i]]=64;if(i==17) app[elememts[i]]=65;if(i==18) app[elememts[i]]=108;if(i==19) app[elememts[i]]=127;if(i==20) app[elememts[i]]=137;if(i==21) app[elememts[i]]=178.5;if(i==22) app[elememts[i]]=195;if(i==23) app[elememts[i]]=197;if(i==24) app[elememts[i]]=201;}
}double water(int l,int r)
{int i=l+1,num=0;while(s[i]>='0'&&s[i]<='9'){num=num*10+s[i]-'0';i++;}if(num==0) return 18;return num*18;
}double answer(int l,int r)
{int i=l;double now=0,last=0;while(i<=r){if(s[i]>='A'&&s[i]<='Z'){if(s[i+1]>='a'&&s[i+1]<='z') {if(s[i+2]!='_'){string str;str+=s[i];str+=s[i+1];now+=app[str];i+=2;}else {string str;str+=s[i];str+=s[i+1];now+=app[str];last=app[str];i+=2;}}else {if(s[i+1]!='_'){string str;str=s[i];now+=app[str];i++;}else{string str;str=s[i];now+=app[str];last=app[str];i++;}   }}if(s[i]=='('){int j;for(j=i+1;j<s.size();++j){if(s[j]==')') break;}double t=answer(i+1,j-1);i=j+1;if(s[i]=='_') {last=t;}now+=t;    }if(s[i]=='_'){if(last==0){string str2;str2=s[i-1];i+=2; int num=0;while(s[i]!='}'){num=num*10+s[i]-'0';i++;}now+=(num-1)*app[str2];   }else{int num=0;i+=2;//cout<<s[i]<<" ";while(s[i]!='}'){num=num*10+s[i]-'0';i++;}now+=(num-1)*ls;}      i++;  }if(s[i]=='~') return now; }return now;
}int main()
{init_elements();  //化学元素初始化cin>>s;ans=answer(0,s.size()-1);  int t=s.find('~',0);if(t!=s.npos) ans+=water(t,s.size()-1);cout<<ans<<endl;return 0;
}

洛谷P4711 【化学】 相对分子质量 简单题解相关推荐

  1. 洛谷P5633 最小度限制生成树 题解

    洛谷P5633 最小度限制生成树 题解 题目链接:P5633 最小度限制生成树 题意: 给你一个有 n n n 个节点, m m m 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号 ...

  2. 洛谷P5520 [yLOI2019] 青原樱 题解

    洛谷P5520 [yLOI2019] 青原樱 题解 题目链接:P5520 [yLOI2019] 青原樱 题意: n n n 个空放 m m m 个物品,两两物品不能直接相邻,至少空一格 纯数学题. 看 ...

  3. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  4. 洛谷P1282 多米诺骨牌 题解

    洛谷P1282 多米诺骨牌 题解 题目链接:P1282 多米诺骨牌 题意: 多米诺骨牌由上下 222 个方块组成,每个方块中有 1∼61\sim61∼6 个点.现有排成行的上方块中点数之和记为 S1S ...

  5. 洛谷P4084 [USACO17DEC]Barn Painting G 题解

    洛谷P4084 [USACO17DEC]Barn Painting G 题解 题目链接:P4084 [USACO17DEC]Barn Painting G 题意:题意:给定一颗N个节点组成的树,3种颜 ...

  6. 洛谷P3237 [HNOI2014]米特运输 题解

    洛谷P3237 [HNOI2014]米特运输 题解 题目链接:P3237 [HNOI2014]米特运输 题意: 这题面是真的长啊 qwq 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为 ...

  7. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  8. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  9. 洛谷P4287 [SHOI2011]双倍回文 题解

    洛谷P4287 [SHOI2011]双倍回文 题解 题目链接:P4287 [SHOI2011]双倍回文 题意: 记字符串 www 的倒置为 wRw^RwR .例如 (abcd)R=dcba(\tt{a ...

最新文章

  1. 数据结构笔记 递推与迭代
  2. python整体设计目标_Python 入門語法和類型(学习)
  3. phabricator mysql_Phabricator服务的搭建
  4. maven 本地仓库添加jar包
  5. 数据分析 | 将业务问题转换为统计问题后,我看到了数字的真相
  6. 鸿蒙系统下载地址_华为鸿蒙系统下载
  7. ks线切割编程系统3.13完整版-2次加密注册码
  8. 全国计算机一级模拟考试电脑版,全国计算机等级考试一级计算机基础及MS Office应用模拟练习系统...
  9. java万年历报告_java万年历设计报告
  10. 阿里云封禁端口25,导致smtp.126.com邮件无法发送-解决方案+springboot配置
  11. 麒麟信安总裁刘文清:携手 openEuler,共推操作系统产业新发展
  12. 使用mosquitto库命令与腾讯云通信
  13. 获取iOS设备唯一标示
  14. 4.9. 相等的多项式
  15. 冯绍峰,如果你爱她,记得不要把名字倒过来讲!
  16. Matalb更换YaHei Consolas Hybrid字体
  17. 电子邮件乱码产生的主要原因及几种解决方法
  18. 2021-2028年按技术(2D、3D、面部分析)、应用程序(访问控制、安全和监控)、最终使用、地区和细分预测分列的面部识别市场规模、份额和趋势分析报告
  19. 监控摄像头,车载摄像头选型
  20. matlab定位文件,Matlab读写文件时的定位

热门文章

  1. EMC测试仪器_如何实现EMC的测试工作?
  2. c语言二级考试知识点,2016年计算机二级考试C语言知识点大全
  3. 2012二级c语言上机,2012全国计算机等级考试-二级C语言-上机考试-填空题-分类总结...
  4. 线上教育相关的微信公众号图文这样排版,阅读量翻十倍!
  5. arcgis js 4 风场可视化
  6. 4十4十4写成乘法算式_乘法算式怎么写
  7. 2021年中国移动互联网行业发展现状及行业发展趋势分析[图]
  8. Springboot面向全球电子商城系统3v50f计算机毕业设计-课程设计-期末作业-毕设程序代做
  9. win7 32位浏览器不能打开,64位浏览器正常的解决方法
  10. linux32 浏览器,谷歌停止支持32位linux系统的Chrome浏览器