给一串分子式,求它的相对分子质量
只含C,H,O,N
C=12.01 g/mol
H=1.008 g/mol
O=16.00 g/mol
N=14.01 g/mol
输入格式:
第一行一个数n表示分子式数量,接下来n行每行一个分子式
输出格式:
每行输出一个相对分子质量
输入样例:
4
C
C6H5OH
NH2CH2COOH
C12H22O11
输出样例:
12.010
94.108
75.070
342.296
主要需要注意如何正确识别字母之后的数字,并转化成数字存储
#include<stdio.h>
#include<string.h>
int main()
{
char chem[100];
double cal[200];
memset(cal,0,sizeof(cal));
double h=1.008,c=12.01,o=16.00,n=14.01,m=0;
int x,i,j,t=0;
scanf("%d",&x);
for(i=0;i<x;i++)
{
scanf("%s",chem);
for(j=1;j<=strlen(chem);j++)
{
if(chem[j-1]=='H')
{cal[t]=h;
t++;
cal[t]=1;
}
else if(chem[j-1]=='C')
{cal[t]=c;
t++;
cal[t]=1;
}
else if(chem[j-1]=='O')
{cal[t]=o;
t++;
cal[t]=1;
}
else if(chem[j-1]=='N')
{cal[t]=n;
t++;
cal[t]=1;
}
if(chem[j]<='9'&&chem[j]>='0'&&chem[j-1]>'A'&&chem[j-1]<'Z')
{
cal[t]=(double)(chem[j]-'0');
}
else if(chem[j]<='9'&&chem[j]>='0'&&chem[j-1]<='9'&&chem[j-1]>='0')
{
t--;
cal[t]=cal[t]*10+(double)(chem[j]-'0');
}
if(chem[j+1]<='Z'&&chem[j+1]>='A'&&chem[j]<='9'&&chem[j]>='0')
t--;
t++;
}
for(j=0;j<t;j+=2)
{
m+=(cal[j]*cal[j+1]);
}
printf("%.3f\n",m);
memset(cal,0,sizeof(cal));
t=0;
m=0;
}
return 0;
}