UVA1586 - Molar mass(紫书习题3.2)
HJL是一个从不讽刺人的品学兼优的好孩子,她最近沉迷学习化学而不能自拔。然而计算一个分子的相对分子质量使她烦不胜烦,因此她决定请你写一个程序来帮助她计算这种麻烦的事情。
已知:
①C代表的碳元素的相对原子质量为12.01,H代表的氢元素的相对原子质量为1.008,O代表的氧元素的相对原子质量为16.00,N代表的氮元素的相对原子质量为14.01。
②一个分子的相对分子质量等于组成这个分子的所有原子的相对原子质量的和:例如,分子式为C6H5OH的分子的相对分子质量为:12.01*6+1.008*5+16.00+1.008=94.108。
Input
输入首先是一个整数n,代表接下来有n个分子式。
接下来的n行,每行有一个字符串形式的分子式。数据保证字符串的长度不超过90。
在分子式中,只可能出现C、H、O、N四种字母。
在分子式中,每个代表元素的字母后面可能会出现数字,这些数字将不小于1且不大于100。
Output
对于每组输入,在单独的一行内输出他的相对分子质量,小数点后保留3位(%.3lf)。
Sample Input
4
C
C6H5OH
NH2CH2COOH
C12H22O11
Sample Output
12.010
94.108
75.070
342.296
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
string s;
int t;
cin>>t;
while(t--)
{
cin>>s;
int i,j,t,a[100];
double sum=0;
int l=s.length();
for(i=0;i<l;++i)
{
t=0;
if(s[i]=='C')
{
for(j=1;j<l;++j)
{
if(s[i+j]>='0'&&s[i+j]<='9')
t=t*10+s[i+j]-'0';
else
break;
}
if(t==0)
t=1;
sum+=t*12.01;
}
else if(s[i]=='H')
{
for(j=1;j<l;++j)
{
if(s[i+j]>='0'&&s[i+j]<='9')
t=t*10+s[i+j]-'0';
else
break;
}
if(t==0)
t=1;
sum+=t*1.008;
}
else if(s[i]=='O')
{
for(j=1;j<l;++j)
{
if(s[i+j]>='0'&&s[i+j]<='9')
t=t*10+s[i+j]-'0';
else
break;
}
if(t==0)
t=1;
sum+=t*16.00;
}
else if(s[i]=='N')
{
for(j=1;j<l;++j)
{
if(s[i+j]>='0'&&s[i+j]<='9')
t=t*10+s[i+j]-'0';
else
break;
}
if(t==0)
t=1;
sum+=t*14.01;
}
}
printf("%.3lf\n",sum);
}
return 0;
}