3-2分子量(Molar Mass)
给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含4种原子,分别为C, H, O, N,原子量分别为12.01, 1.008, 16.00, 14.01(单位:g/mol)。例如,C6H5OH的分子量为94.108g/mol。
这个代码没有放到UVa上面AC,只是自己写一下练一连的,如果要AC,应该要根据UVa上的输入输出样例稍微改一下
思路:
本题难度不大,是属于字符串处理一类的问题。有两个关键点。
- 输入量中可能是
字母+数字
也可能是字母+另一个字母
,想要处理这样的情况就要在处理当前字符之前,判断下一个字符是字母还是数字,以此来做不同的处理。 - 另一个关键点就是,字母后面可能是两位,三位甚至四位,而不仅仅是题目里给出的C6H5OH,比如还可能是C20H50O10,当然这个是随便列举的,但输入很有可能是这种情况,所以也需要注意。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <ctype.h>
char buffer[100]; //存放输入量
double s[30]; //用来存放对应的原子量
int main()
{
s['C' - 'A'] = 12.01; //对应的位置存放C的原子量
s['H' - 'A'] = 1.008; //对应的位置存放H的原子量
s['O' - 'A'] = 16.00; //对应的位置存放O的原子量
s['N' - 'A'] = 14.01; //对应的位置存放N的原子量
while(scanf("%s",buffer) == 1) {
double mass = 0; //总的原子量
int n = strlen(buffer); //输入的字符串长
double molar = 0; //当前处理的原子量
/*
对原子量的计算
*/
for ( int i = 0; i < n; i++ ) {
if(isdigit(buffer[i])) continue; //碰到数字直接跳,至于为什么,看后面
if(isalpha(buffer[i])) { //如果是字母就进行处理
if(isalpha(buffer[i+1]) || i == n - 1) { //该字符下一个字符如果还是字母,那说明它就一个元素,加一下对应的原子量就直接处理下一个字符,还要注意判断是不是最后一个字符,也是同理
mass += s[buffer[i] - 'A'];
continue;
}
molar = s[buffer[i] - 'A']; //如果字母后面跟的是数字的话,就会执行到这里,将对应的原子量放在molar变量里,提高代码的可读性
int num = 1,sum = 0;
while(isdigit(buffer[i + num])) num++; //剩下的就是计算带数字的原子量了,看看就懂了
for(int j = 1; j < num; j++ ) {
sum = sum * 10;
sum += (buffer[i+j] - '0');
}
mass += (molar * sum);
}
}
printf("%s的分子质量为%.3lfg/mol\n",buffer,mass);
}
}