做法可能有些麻烦…将一串分子式存到栈中,然后再计算分子量.
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
#define ll long long
using namespace std;
const int maxn = 1e5+100;
int main()
{
int q[30];
q['C'-'A'] = 13;
q['H'-'A'] = 1;
q['O'-'A'] = 17;
char str[maxn];
int len;
while(fgets(str,maxn,stdin))
{
stack<char>num;
len = strlen(str)-1;
for(int i=0; i<len; i++)
{
num.push(str[i]);
}
ll f=1,m=1,ans = 0;//f是右括号旁边的数字,即括号内分子式重复的次数,m是 () 里面某个原子重复次数
while(!num.empty())
{
char ch = num.top();
num.pop();
if(ch>='0'&&ch<='9')//计算元素(或括号内的分子式)重复出现的次数
{
f = ch-'0';
for(int i=1;;i++)
{
if(num.top()>='0'&&num.top()<='9')//次数大于等于10
{
int w = num.top()-'0';
f+=w*(ll)pow(10,i);
num.pop();
}
else
{
break;
}
}
}
else if(ch == ')')//计算括号内的分子量
{
int l = 0;
while(num.top()!='(')
{
if(num.top()>'9'||num.top()<'0')
{
l+=q[num.top()-'A']*m;
num.pop();
m=1;
}
else if(num.top()>='0'&&num.top()<='9')
{
m = num.top()-'0';
num.pop();
for(int i=1;;i++)
{
if(num.top()>='1'&&num.top()<='9')
{
m+=(num.top()-'0')*(ll)pow(10,i);
num.pop();
}
else
{
break;
}
}
}
}
if(num.top() == '(')
{
num.pop();
ans+=l*f;
f=1;
}
}
else if(ch>'9'||ch<'0')
{
ans+=f*(q[ch-'A']);
f=1;
}
}
printf("%lld\n",ans);
}
return 0;
}