题目:UVa--1586
思路:将输入的字符串割分为元素符号与数字的集合(数字为1的默认不写),例如将C2H5OH分为C5,H5,O,H四个部分,接下来就是将这四部分进行统一处理了
统一处理方法:每一次先判断前面的元素符号到底是什么(主要是为了返回元素的相对原子质量进行后面的计算),然后通过后面的数字字符得到该原子的个数
#include<stdio.h>
#include<string.h>
#include<ctype.h>
double AtomicWeight(char c){
if(c == 'C')
return 12.010;
else if(c == 'H')
return 1.008;
else if(c == 'O')
return 16.000;
else if(c == 'N')
return 14.010;
} //判断元素符号并返回元素的相对摩尔质量
int main(){
char a[85];
int T;
double ans;
scanf("%d",&T); //T个测试例
while(T--){
scanf("%s",a);
int len = strlen(a);
int i = 0;<span style="white-space:pre"> </span>//从第一个字符开始
ans = 0;
while(i < len){
double t = AtomicWeight(a[i]); //判断元素符号并返回其相对原子质量
int n;<span style="white-space:pre"> </span> //原子个数
if(isalpha(a[i+1])||a[i+1]=='\0'){
n = 1;
i++;
}
else{
n = 0;
while(isdigit(a[i+1])){
n = 10*n + a[i+1] - '0';
i++;
}
i++; //保证处理的每部分都以元素符号开头
}
ans += (t*n);<span style="white-space:pre"> </span>//计算总分子质量
}
printf("%.3f\n",ans); //结果保留三位小数
}
}