记录编号 |
94054 |
评测结果 |
WWWWW |
题目名称 |
相对分子质量 |
最终得分 |
0 |
用户昵称 |
Letter 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;
}