求分子量算法

本人是小白~ 喷轻点~

分析:

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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值