UVA 1586 Molar mass

来源:互联网 发布:巨人网络借壳辽宁成大 编辑:程序博客网 时间:2024/06/11 21:45

刚发现这四道题连在了一起,1583-1586,23333333

这道题是个水题,考查了对字符串的处理能力。一入手这道题第一想法是遇到化学元素就读下一个字符看看是不是数字然后展开的一系列特判。。。这个思路的耦合性太高,太多特判导致这个程序的健壮性太弱。所以我对字符进行逐个处理,遇到元素怎样,遇到数字怎样。。。

下面附代码:

#include <iostream>#include <algorithm>#include <map>#include <cstdio>using namespace std;int main(){    map<char, double> Base;    Base['H'] = 1.008;    Base['O'] = 16.0;    Base['N'] = 14.01;    Base['C'] = 12.01;    int t;    scanf("%d", &t);    while(t--)    {        string line;        cin >> line;        int len = line.size();        double sum = 0;        char key = '\0';        int num = 0;        for(int i = 0; i < len; i++)        {            if(Base.count(line[i]))            {                if(num > 0)                {                    sum += (Base[key] * num);                    num = 0;                }                else                {                    sum += Base[key];                }                if(i == len -1)                {                    sum += Base[line[i]];                }                else                {                    key = line[i];                }            }            else            {                if(num > 0)                {                    num *= 10;                    num += (line[i] - '0');                }                else                {                    num += (line[i] - '0');                }                if(i == len -1)                {                    sum += (Base[key] * num);                }            }        }        printf("%.3lf\n", sum);    }    return 0;}