一个分子式定义为由一个组原子组成的序列表示。例如字母H表示氢原子,C表示碳原子,氧原子则用O表示,分子式COOH代表有1个碳原子,2个原子氧和1氢原子。
为了有效地写一些分子式,我们使用下面的规则:
分子式的某些原子可写在封闭在括号内,例如:分子式CH(OH)中的OH(即OH形成一组)被括号包含。当然这种情况也可以嵌套,即一组还可以包含其他组。为了简化公式,在同一分子式中连续出现原子可以被替换为在该原子之后标记出现的次数。例如公式COOHHH可以写成CO2H3,它代表这个分子由:1个碳原子,2个原子氧和3个氢原子组成。
同样,一组连续的分子也可以被替换的该组之后标记出现的次数。例如分子式CH(CO2H)(CO2H)(CO2H)可以写成CH(CO2H)3,这两个分子式代表的分子由:4个碳原子,4个氢原子和6个氧原子组成。
原子或一组分子后所跟的数字范围在2到9之间。
一个分子的质量是其所有原子质量的总和。我们规定一个氢原子的质量为1,一个碳原子质量为12,一个氧原子的质量16。
编写一个程序,将计算出一个分子对应的质量。
仅一行: 一个分子式(这其中由大写字符H,C,O,和(,),2,3,...,9等组成),长度不超过100。
仅一行:输出该分子式的质量(质量最大不超过10000)。
CH(CO2H)3
148
本蒟蒻看不懂标程QAQ
#include <bits/stdc++.h>
using namespace std;
string s;
char a[3]={'C','H','O'};
char LEFT='(',RIGHT=')';
int m[3]={ 12,1,16};
int pos,total,N=3,MAXLEN=100;
int dfs()
{
int sum,i;
if (s[pos]==LEFT)
{
sum=0;
pos++;
while(s[pos]!=RIGHT)
{
sum+=dfs();
}
pos++;
}
else
{
for (i=0;i<N;i++)
{
if (s[pos]==a[i])
{
sum=m[i];
}
}
pos++;
}
if (s[pos]>='1' && s[pos]<='9')
{
sum*=s[pos]-'0';
pos++;
}
return sum;
}
int main ()
{
cin >> s;
s='('+s+')';
pos=0;
cout<<dfs()<<endl;
return 0;
}