分子量(UVa1586)

分子量(UVa1586)

给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含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 <bits/stdc++.h>
#define maxn 256
#define _for(i,a,b) for(int i=(a);i<(b);++i)
typedef long long ll;
using namespace std;

int main(){
    unordered_map<char,double>um{{'C',12.01},{'H',1.008},{'O',16.0},{'N',14.01}};
    //for(auto x:um) cout<<x.first<<" : "<<x.second<<endl;
    int N;
    char s;
    scanf("%d\n",&N);
    char buf[maxn];//buf是英文buffer的缩写,意思是缓冲区, 它本质上就是一段存储数据的内存。
    while(N--){
        int cnt = -1;//用来维护当前已经输入的数字cnt,cnt=-1表示该字母还未开始计数
        double ans = 0.0;
        s = 0;
        scanf("%s",buf);
        _for(i,0,strlen(buf)){
            char c = buf[i];
            if(isupper(c)){//是否为大写英文字母
                if(i){
                    if(cnt==-1) cnt = 1;
                    ans+=um[s]*cnt;//把之前的大写字母(带着他的数字)先加上
                }
                s = c;//加上之后s更新为当前的大写字母
                cnt = -1;
            }
            else{
                assert(isdigit(c));
                if(cnt==-1) cnt = 0;
                cnt = cnt*10+c-'0';
            }
        }
        if(cnt==-1) cnt = 1;
        ans+=um[s]*cnt;
        printf("%.3lf\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhaohaibo_/article/details/80464787
今日推荐