算法竞赛入门经典(第二版) 习题3-2 分子量(Molar Mass) UVa1586


Page 57

题意:给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含4种原子:C,H,O,N,原子量分别为12.01,1.008,16.00,14.01.


Sample Input

4 
C
C6H5OH
NH2CH2COOH
C12H22O11

Sample Output

12.010 
94.108
75.070
342.296


//要把最后一个字符的属性单独考虑
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cctype>
using namespace std;
#define max 105
char s[max];
int main(){
//freopen("in.txt","r",stdin);
int t;
double a[100];
a['C']=12.01;a['H']=1.008;a['O']=16.00;a['N']=14.01;
scanf("%d",&t);
while(t--){
scanf("%s",s);
int i=0,cnt=0;
double ans=0;
char tran[100];
memset(tran,0,sizeof(tran));
while(s[i]!=0){
if(isalpha(s[i])){
tran[cnt]='\0';
ans+=a[s[i-cnt-1]]*atoi(tran);
//注意是i-cnt-1
//大部分原子量的计算都在这一步
cnt=0;
if(s[i+1]==0||isalpha(s[i+1])) ans+=a[s[i]];//最后一个字符是字母的话,这种原子就只有一个,直接加上原子量就行了
}
else {
tran[cnt++]=s[i];
if(s[i+1]==0) {
//如果最后一个字符是数字,接下来就要加上这个原子的总原子量
//但是由于s[i+1]='\0',所以i++后就退出while循环了,也就不能执行line 24计算原子量了,所以要特别考虑
tran[cnt]='\0';
ans+=a[s[i-cnt]]*atoi(tran); //注意是i-cnt
}
}
i++;
}
printf("%.3lf\n",ans);
}
return 0;
}


智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告