原题见:http://vjudge.net/problem/UVA-1586
题目大意:给出一种物质的分子式,求它的分子量。已知包含四种分子:
H 1.008g/mol
O 16.00g/mol
C 12.01g/mol
N 14.01g/mol
样例输入:
4
C
C6H5OH
NH2CH2COOH
C12H22O11
样例输出:
12.010
94.108
75.070
342.296
难点分析:当存在连续的数字时对于其元素的总分子量计算的问题。
整体思路:加分子量时只考虑是字母的情况,数字则是在之后考虑,并不直接参与计算
下面上代码:
#include<iostream>
#include<cstring>
#include<cctype>
using namespace std;
double a[4]={12.01,1.008,16.00,14.01};
double pan(char b) //判断是哪种元素
{ double x;
if(b=='C')
x=a[0];
else if(b=='O')
x=a[2];
else if(b=='H')
x=a[1];
else if(b=='N')
x=a[3];
return x;
}
int main()
{
int t;
cin>>t;
while(t--)
{
char str[80];
memset(str,0,sizeof(char));
scanf("%s",str);
double sum=0;
int n=strlen(str);
for(int i=0;i<n;i++){
if(str[i]=='O'||str[i]=='H'||str[i]=='C'||str[i]=='N')
if(isdigit(str[i+1])&&isdigit(str[i+2]))
sum+=(10*(str[i+1]-'0')+(str[i+2]-'0'))*pan(str[i]);
//对于两个连续数字的处理,其实没有完全解决问题。并没有考虑三个数字连续的情况,不过题目数据也没有卡这个地方。
else
sum+=(isdigit(str[i+1])?(str[i+1]-'0'):1)*pan(str[i]);
//看元素后一位是否是数字
}
printf("%.3f\n",sum);
}
return 0;
}