UVa1586
给出一种物质的分子式(不带括号),求分子量。本题的分子式只包含4种原子,分别为C,H,O,N,原子量分别为12.01,1.008,16.00,14.01(单位:g/mol)。例如,C6H5OH的分子量为94.108g/mol。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX 256
int main()
{
double element[MAX] = {0};//存放原子的原子量
element['C'] = 12.01;
element['H'] = 1.008;
element['O'] = 16.00;
element['N'] = 14.01;
char s[MAX];//分子式
scanf("%s", s);
size_t num = strlen(s);
int count = 0;//原子的个数
double ans = 0;//分子量
for (int i = 0; i < num; i++)//分子式剖析为各个字符
{
char c = s[i];
if (isupper(s[i]) && isdigit(s[i + 1]))//情况一:原子后面有大于1的数
{
while (isdigit(s[i + 1]))//统计原子后面的数字
{
count = 10 * count + (s[i + 1] - 48);
i++;//这里i++有两个作用:1,为了统计下一个数字,比如C12原本i下标对应C,现在i++对应1,接下来就统计下一位数字;2,倘若下一位不是数字,这里i++后指向数字,到了for循环结尾又会i++指向下一个字母
}
ans += count * element[c];//注意这里要用element[c],不能用element[s[i]],因为这里的i不是刚开始的i了
count = 0;//为下一次做准备
}
else
{
ans += element[s[i]];//情况二:原子后面没有数字,即为一个原子
}
}
printf("%.3fg/mol\n", ans);
return 0;
}