本人是小白~ 喷轻点~
分析:
1.扫描字符串,用 s 记录当前字符
2.如果遇到大写字母,则用 c 记录这个字母,方便下次遇到新的大写字母需要用到 c
3.如果遇到数字串,用cnt记录这个数字串
4.到下次遇到新的字母的时候,则 总质量+=(cnt*c的质量)
cnt记录数字串:
cnt=-1的时候,代表还没有开始记录。
遇到一个 s 为 数字字符 的时候,如果cnt=-1 则 cnt = s - '0'
如果cnt ≠ -1 则 cnt = cnt ✖ 10 + s - '0'
#include<iostream>
#include<cctype>
using namespace std;
#define max 256
int main() {
char c=0, s=0, str[max]; //c记录上次读取到的大写字母,s记录当前字符;
double W[max], M = 0;
W['C'] = 12.01;
W['H'] = 1.008;
W['O'] = 16.00;
W['N'] = 14.01;
W[0] = 0;
int cnt = -1; // 记录原子数,-1表示未开始记录
int sz, i;
cin >> str;
sz = strlen(str);
str[sz] = 'E'; // 标记结束字符
for (i = 0; i <= sz; i++) {
s = str[i]; // 获取当前字符
if (isupper(s)) { //如果大写
if (cnt == -1) { //如果未开始计原子数
M += W[c]; //质量直接相加
}
else { //如果出现 数字
M += cnt*W[c];
cnt = -1; // 遇到大写字母,初始化 出现的数字 为-1
}
c = s; // c 记录下出现的大写字母,下次遇到新的大写字母的时候需要用上
}
if (isdigit(s)) { //如果为数字
if (cnt == -1) { // 如果未开始计原子数
cnt = s - '0'; //则 cnt为原子数
}
else { //如果已经开始计原子数,则用上次的 cnt*10 再加上 当前读取到的 数字 ,得到新的原子数;
cnt = cnt * 10 + s - '0';
}
}
}
cout << M;
return 0;
}