记录编号 | 94054 | 评测结果 | WWWWW | ||
---|---|---|---|---|---|
题目名称 | 相对分子质量 | 最终得分 | 0 | ||
用户昵称 | 是否通过 | 未通过 | |||
代码语言 | 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;
- }