给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含4种原子,分别为C, H, O, N,原子量分别为12.01, 1.008, 16.00, 14.01(单位:g/mol),输入t个分子式,输出分子量,保留三位小数。
输入:
4
C
C6H5OH
NH2CH2COOH
C12H22O11
输出:
12.010
94.108
75.070
342.296
直接附上代码
#include <iostream>
using namespace std;
int main()
{
double W[256];//将CHON的原子量存入W数组
W['C'] = 12.01, W['H'] = 1.008, W['O'] = 16.0, W['N'] = 14.01;
char buf[256],c;
int T, cnt =0;
double ans = 0;
scanf("%d", &T);
while (T--)
{
scanf("%s", buf);
for (int i = 0; i+1 <= strlen(buf); i++)
{
c = buf[i];//c接收buf[i],便于操作
if (isupper(c)&&isdigit(buf[i+1]))
{ //while循环找出c后的所有数字,并且算出'c'元素的个数!
while (isdigit(buf[i + 1]))
{
cnt = cnt * 10 + (buf[i + 1] - '0');//每次*10
i++;//不要忘记i++
}
ans += cnt * W[c];
cnt = 0;
}
else {
ans += W[c];//单个元素情况
}
}
printf("%.3lf\n", ans);
ans = 0;
}
return 0;
}
这道题有一点值得注意,很容易造成解答不完全!
eg:C6H5OH:这组例子元素后只有1个数字,容易解答但是看下面的例子
eg:C258H798O33333 对于元素后有多个数字的情况要考虑清楚,也是这道题的关键!
isupper()这个方法是判断是否为大写字母,isdigit()这个方法判定是否为数字!
这道题也要注意边界条件i+1<strlen(s)而不是i<strlen(s)
谢谢观看,多多点赞嘻嘻!