分子量(ACM/ICPC)详细解答

给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含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)
谢谢观看,多多点赞嘻嘻!

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值