记录编号 94054 评测结果 WWWWW
题目名称 相对分子质量 最终得分 0
用户昵称 GravatarLetter zZZz 是否通过 未通过
代码语言 C++ 运行时间 0.003 s
提交时间 2014-03-29 20:10:25 内存使用 0.78 MiB
显示代码纯文本
#include <fstream>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin ("molecular.in");
ofstream fout ("molecular.out");
int numd;
int nums;
int p=0;
double stack[200];
double mass[100]={0};
class T
{
public:
	string name;
	double m;
}d[20000];
T s[20000];
double mad(string x)
{
	for (int i=0;i<=numd;i++)
		if (x==d[i].name)return d[i].m;
	return -1;
}
double mas(string x)
{
	for (int i=0;i<=nums;i++)
		if (x==s[i].name)return s[i].m;
	return -1;
}
double work(string x)
{
	int l=strlen(x.c_str());
	int i,j=0;
	for (i=0;i<l;)
	{
		if (x[i]>='A'&&x[i]<='Z'&&x[i+1]>='a'&&x[i+1]<='z')
		{
			string y,z1,z2;
			z1=x[i];
			z2=x[i+1];
			y=z1+z2;
			double q=mas(y);
			if (q!=-1)mass[j]=q;
			else if (q==-1) return -1;
			j++;
			i+=2;
		}
		else if (x[i]>='A'&&x[i]<='Z')
		{
			string y,z;
			z=x[i];
			y=z;
			double q=mad(y);
			if (q!=-1)mass[j]=q;
			else if (q==-1) return -1;
			j++;
			i++;
		}
		else if (x[i]=='(')
		{
			mass[j]=-1;
			i++;
			j++;
		}
		else if (x[i]==')')
		{
			mass[j]=0;
			i++;
			j++;
		}
		else if (x[i]>='0')
		{
			mass[j]=(x[i]-'0')*(-1)-2;
			i++;
			j++;
		}
	}
	for (i=0;i<j;i++)
		if (mass[i]<-1&&mass[i+1]<-1)
		{
			mass[i]=(mass[i]+2)*10+(mass[i+1]+2)-2;
			mass[i+1]=0;
		}
	for (i=0;i<j;i++)
		if (mass[i]>0&&mass[i+1]<-1)
		{
			mass[i]=mass[i]*(mass[i+1]+2)*(-1);
			mass[i+1]=0;
		}
	stack[0]=0;
	stack[1]=0;
	stack[2]=0;
	stack[3]=0;
	stack[4]=0;
	stack[5]=0;
	stack[6]=0;
	p=1;
	for (i=0;i<j;i++)
	{
		if (mass[i]>0)
		{
			while (mass[i]>=0)
			{
				stack[p]=stack[p]+mass[i];
				i++;
				
			}
			while (mass[i]>=0);
			p++;
		}
		if (mass[i]<0)
			stack[p-1]=stack[p-1]*(mass[i]+2)*(-1);
	}
	return stack[p-1];
}
int main()
{
	double M;
	string n;
	for (nums=0,numd=0;;)
	{
		fin>>n;
		if (n=="END_OF_FIRST_PART")
			break;
		else 
		{
			fin>>M;
			if (n.length()==1)
			{
				d[numd].name=n;
				d[numd].m=M;
				numd++;
			}
			else 
			{
				s[nums].name=n;
				s[nums].m=M;
				nums++;
			}
		}
	}                               //将相对原子质量输入到a//
	fin>>n;
	while (n!="0")
	{
		double ans=work(n);
		if (ans!=-1)
			fout<<ans<<endl;
		else if (ans==-1)
			fout<<"UNKNOWN"<<endl;
		fin>>n;
	}
	return 0;
}