【B-分子】2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(同步赛)

其实就是一个简单的模拟,但比赛的时候没过我可太离谱了
链接:https://ac.nowcoder.com/acm/problem/210352
来源:牛客网

题目描述
在遥远的斯卡布罗集市,有机分子只能由 C, H, O 三种元素组成。根据珂学家们的探测,一个 C 原子的式量为 13 ,一个 H 原子的式量为 1 ,一个 O 原子的式量为 17 。一个有机分子的式量恰为各个原子的式量的总和。

*对于有机分子式给出如下定义:
有机分子式只可能包含数字、括号和 C, H, O 三种元素标记;
数字只能出现在元素标记或右括号的右边,代表该元素(或括号内的分子式)重复出现的次数;
数字只可以是不包含前导零的正整数;
如果一个元素右侧没有数字,那么表示该元素只出现一次;
括号内包含非空的有机分子式,但该有机分子式不再嵌套括号。

例如 (HH)3H(H)、CO2、CH12、CHHOO 都是合法的有机分子式。

而 4HC、CHTHOLLOY、CH3(CH2)3(CH(CHCH3)2CH3)2(CH2)3CH3 都不是合法的有机分子式。

对于符合上述要求的分子式,你能帮助珂学家们计算它的分子式量吗?

输入描述:
输入仅一行,包含一个字符串,代表分子式。

保证符合上述定义,字符串中不含除 C, H ,O,括号和数字以外的字符,且长度不超过 10^5。

输出描述:
在一行中输出一个整数,代表该分子的式量。

保证答案不超过 10^15 。

示例1
输入
CH3COOH

输出
64

示例2
输入
CH3(CH2)10CH3

输出
182

示例3
输入

H(HH)C(CH2)3O(H)1

输出
79

备注:
斯卡布罗集市是一个魔法集市,所以对化学的定义可能和麻瓜世界略有不同。

在第二个样例中,一共出现了 12 个C和 26 个H;

在第三个样例中出现了 4 个 C、10 个 H 和 1 个 O。

对于部分编程语言,请注意使用合适的数据类型以避免答案溢出。

直接模拟一开始我敲了一百多行~~(感觉一半废代码)~~ ,后来看到一个递归的,也不难理解,感觉还挺好的。

代码:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<stack>
    #include<iomanip>
    using namespace std;

    typedef long long ll;
    ll len,i;
    char a[100006];
    ll fun()   
    {
     ll sum=0,x=0,ans=0;   //sum是字母后的数字转换成的ll型,x是元素的值,ans是最后所有的值(就是答案)
     for( i;i<len;i++)   //这个i不能写成i=0,不然递归会出问题
     {
         sum=0;
         while(a[i]>='0'&&a[i]<='9')
         {
             sum=sum*10+a[i]-'0';
             i++;
         }
         if(sum==0)
            sum=1;
         ans+=sum*x;
         x=0;        //这里x重置一下,不然后面括号出来的值会跟着乘(出大问题)
         //cout<<"x:"<<x<<endl;    //不理解的可以把这些注释打开,跑几个数据看看应该就大概了解了
         //cout<<"sum:"<<sum<<endl;
         //cout<<"ans:"<<ans<<endl;
         //cout<<endl<<endl<<endl;
         if(a[i]=='H')
            x=1;
         else if(a[i]=='O')
            x=17;
         else if(a[i]=='C')
            x=13;
         if(a[i]=='(')
         {
             i++;
             x=fun();   //递归
         }
         else if(a[i]==')')
            break;

     }
     ans+=x;
     return ans;
    }

    int main()
    {
        gets(a);
        len=strlen(a);
        cout<<fun()<<endl;
        return 0;
    }

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、5资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值