本题主要是考察字符串匹配问题,思路就是先匹配字符,找到相应的原子量,再与后面的数字进行乘法运算,在求和。需要注意的有两个方面:第一、数字可能不止一位所以考虑匹配时要考虑清楚,第二、在化学分子式中有些较为复杂的基,如本题中-OH,以下是别人的代码。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXN 100
char buf[MAXN] = {0};
double t[26] = {0};
int readInt(char * buf, int i, int *num); //前置声明
int main() {
int n;
int ch, num;
t['C'-'A'] = 12.01, t['H'-'A'] = 1.008;
t['O' - 'A'] = 16.00, t['N' - 'A'] = 14.01;//常见的转换字母-'a/A',数字-'0'
scanf("%d", &n);
while (n > 0) {
// 1.输入数据
scanf("%s", buf);
int len = strlen(buf);
double sum = 0.0;
int i = 0;
// 2.计算
for (;;) {
for (; buf[i]&&isalpha(buf[i]); i++) {
sum += t[buf[i] - 'A'];
}
if (i >= len) break;
// 2.1[i, e)为整数范围,num为整数值
int e,num;
e = readInt(buf, i, &num);//引用num变量
sum += t[buf[i - 1] - 'A'] * (num - 1);
i = e;
}
// 3.输出结果
printf("%.3f\n", sum);
n--;
}
return 0;
}
// 如果没有找到则返回i
int readInt(char * buf, int i, int *num) {
int sum = 0;
int j;
for (j = i; buf[j] && isdigit(buf[j]); j++) { //计算数字,将字符型转换成有限位的数字
sum *= 10;
sum += buf[j] - '0';
}
*num = sum;
return j;
}