记录编号 |
56385 |
评测结果 |
AAAAA |
题目名称 |
相对分子质量 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.002 s |
提交时间 |
2013-03-28 21:38:08 |
内存使用 |
0.39 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<deque>
#include<cstring>
#include<iomanip>
using namespace std;
double Ar1[100]={0};//一个字母的原子的相对原子质量
double Ar2[10000]={0};//两个字母的原子的相对原子质量
//哈希,一个字母的就是字母编号,两个字母的,第一个*100+第二个
string s;
deque<double> stn;//存放计算出来的数据
deque<char> stb;//存放括号
void read(void){
string str="\0";
double r;
int l;
while(1){
cin>>str;
if(str=="END_OF_FIRST_PART") break;
getchar();
scanf("%lf",&r);
l=str.size();
if(l==3){
cout<<"居然有三个字母的....节操呢"<<endl;
return;
}
if(l==1){
Ar1[str[0]-'A']=r;
}
else{
Ar2[100*(str[0]-'A')+str[1]-'a']=r;
}
}
}
double getm(string str){//得到str元素的相对原子质量
int temp;
if(str.size()==1){
temp=str[0]-'A';
if(Ar1[temp]!=0) return Ar1[temp];
else return -1;
//return Ar1[str[0]-'A'];
}
temp=100*(str[0]-'A')+str[1]-'a';
if(Ar2[temp]!=0) return Ar2[temp];
else return -1;
//rAr2[100*(str[0]-'A')+str[1]-'a'];
}
string getatom(int &i){
string ans="\0";
ans+=s[i];
int len=s.size();
while(i+1<len&&'a'<=s[i+1]&&s[i+1]<='z'){
ans+=s[++i];
}
//指向最后一个小写字母
//i++;
return ans;
}
int getnum(int &i){
//cout<<s[i]<<endl;
int ans=0;
int len=s.size();
while(i+1<len&&'0'<=s[i+1]&&s[i+1]<='9'){
ans*=10;
ans+=s[++i]-'0';
}
//指向最后一个数字
//i++;
//cout<<ans<<endl;
return (ans==0)?1:ans;
}
void calc(void){
stn.clear(),stb.clear();
int len=s.size();
int i=0;
string now;
double temp;
int num;
while(i<len){
if(s[i]=='('){
stb.push_back(')');
stn.push_back(0);
i++;
goto NEXT;
}
if('A'<=s[i]&&s[i]<='Z'){//是字母
now=getatom(i);
//i++;
temp=getm(now);
if(temp==-1){
printf("UNKNOWN\n");
return;
}
num=getnum(i);
//cout<<now<<" "<<num<<endl;
i++;
//cout<<s[i]<<endl;
//cout<<now<<" "<<num<<endl;
//cout<<temp<<" "<<num<<endl<<endl;
stn.back()+=temp*(double)num;
goto NEXT;
}
if(s[i]==')'){
//i++;
num=getnum(i);
i++;
temp=stn.back();
if(stn.size()>1){
stn.pop_back(),stb.pop_back();
stn.back()+=temp*(double)num;
}
goto NEXT;
}
NEXT:;
}
//printf("%lf\n",stn.back());
cout<<stn.back()<<endl;
}
void work(void){
string s1;
while(1){
s.clear(),s1.clear();
cin>>s1;
if(s1=="0") return;
if(!(s1[0]=='('||('A'<=s1[0]&&s1[0]<='Z'))) return;
s="("+s1+")";
//cout<<s<<endl;
calc();
}
}
int main(){
freopen("molecular.in","r",stdin);
freopen("molecular.out","w",stdout);
cout<<setiosflags(ios::fixed)<<setprecision(0);
read();
work();
return 0;
}