• 洛谷 T28312 相对分子质量【2018 6月月赛 T2】 解题报告


    T28312 「化学」相对分子质量

    题目描述

    做化学题时,小(F)总是里算错相对分子质量,这让他非常苦恼。

    (F)找到了你,请你来帮他算一算给定物质的相对分子质量。

    如果你没有学过相关内容也没有关系,你可以从样例和提示里理解该题所求内容。

    输入输出格式

    输入格式:
    输入一行,为一个长度为(L (L≤100)) 的不含空格的字符串,表示给定物质的化学式。

    化学式仅包括以下内容:

    元素:如(Au)(金),(Hf)(铪),出现的所有元素及其相对原子质量以附表为准。
    下标:(\_){} :表示某个原子、离子或者原子团的个数,如 H(\_){2}O 表示(H_2O) (水),C_{60} 表示$ C_{60}$(足球烯)。
    括号 ():表示一个原子团,下标对团内物质生效。如 Ca(OH){2} 表示 (Ca(OH)_2) (熟石灰)。
    水合物 ~:如 CuSO
    {4}~5H_{2}O 表示 (CuSO_4 cdot 5H_2O)(胆矾)。水之前如果存在数字,保证一定是大于2的正整数,如果省略该部分则默认为1。如上述胆矾中,表示水的个数的 5。
    形式化地讲,你处理的化学式满足以下规则:

    分子~数量
    其中数量或水合部分可省。

    对于分子,满足:

    部分_{数量}部分_{数量}...部分_{数量}

    其中数量可省。

    对于每个“部分”(原子,原子团,离子……),满足:

    元素

    (元素_{ 数量 }元素_{ 数量}... 元素_{数量})

    其中数量可省。

    请注意,满足上述条件的化学式不会出现括号嵌套;上文中出现的 “数量” 所指代的数字不超过10000 。

    输出格式:
    输出一行,包含一个整数或者小数部分为 .5 的实数,为你的计算结果。

    保证结果不超过 10000 。


    月赛的时候胡乱在写,写的非常乱,最后两个点怎么也过不去。想着是自己码力太差,一堆分类讨论自己也乱了。

    月赛完了之后回家又写了个函数版的,感觉还算整洁,结果还算过不了。

    1个多小时后,我的“Ag”呢·!!它怎么没被打上去呢!!

    好吧,这个错误也太诡了,,

    奉上感觉相对整洁一点的代码(一样丑)

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <map>
    using namespace std;
    map <string,double > ma;
    string s;
    int i=0,len;
    double num()//返回下标
    {
        i+=2;int x=0;
        while(s[i]>='0'&&s[i]<='9')
            x=x*10+s[i++]-'0';
        if(s[i]=='}') i++;
        return x;
    }
    double get()
    {
        string s1=s.substr(i,1);
        string s2=s.substr(i,2);
        if(ma[s2])
        {
            i+=2;
            return ma[s2];
        }
        i++;
        return ma[s1];
    }
    int main()
    {
        ma["H"]=1;ma["C"]=12;ma["N"]=14;ma["O"]=16;ma["F"]=19;
        ma["Na"]=23;ma["Mg"]=24;ma["Al"]=27;ma["Si"]=28;ma["P"]=31;
        ma["S"]=32;ma["Cl"]=35.5;ma["K"]=39;ma["Ca"]=40;ma["Mn"]=55;
        ma["Fe"]=56;ma["Cu"]=64;ma["Zn"]=65;ma["Ag"]=108;ma["I"]=127;
        ma["Ba"]=137;ma["Hf"]=178.5;ma["Pt"]=195;ma["Au"]=197;ma["Hg"]=201;
        cin>>s;
        len=s.size();
        double k=1,ans=0;
        while(i<len)
        {
            if(s[i]=='(')
            {
                double tmp=0.0;
                i++;
                while(s[i]!=')')
                {
                    double d=get();
                    if(s[i]=='_')
                        d*=num();
                    tmp+=d;
                }
                i++;
                if(s[i]=='_')
                    tmp*=num();
                ans+=tmp*k;
            }
            else if(s[i]=='~')
            {
                if(s[i+1]<='9'&&s[i+1]>='0')
                    i--,k=num();
                else
                    i++;
            }
            else
            {
                double d=get()*k;
                if(s[i]=='_')
                    d*=num();
                ans+=d;
            }
        }
        if(int(ans*2)%2==1)
            printf("%.1lf
    ",ans);
        else
            printf("%d
    ",int(ans));
        return 0;
    }
    
    

    2018.6.19

  • 相关阅读:
    深度通道编程模型
    缓冲区溢出实验实验楼
    团队作业(一)
    信安导论学习阶段性总结
    Python总结
    mysql下载及安装
    初识python
    MobileMenuScene来点动画效果
    移动菜单页面PlayerInput
    渲染和填充MobileMenuListItem
  • 原文地址:https://www.cnblogs.com/butterflydew/p/9196832.html
Copyright © 2020-2023  润新知