B 分子

链接:https://ac.nowcoder.com/acm/contest/6871/B
来源:牛客网

题目描述
在遥远的斯卡布罗集市,有机分子只能由 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,括号和数字以外的字符,且长度不超过 10510^5105 。

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

保证答案不超过 101510^{15}1015 。
样例 1:
CH3COOH
输出:
64
样例2:
CH3(CH2)10CH3
输出:
182
样例3:
H(HH)C(CH2)3O(H)1
输出:
79

我的思路是从后向前一个一个分析如果直接遇到一个字母,那直接就加上这个字母的数值,而如果是(CH2)10这样的,就要特殊判断了,我本来是老老实实的,一步一步判断,但是超时了,所以我想到了另一种办法,直接用一个数字表示括号外的数字,如果还没有括号,那这个数字是1,而如果遇到了括号,那就让这个数字变为括号外的数,而从括号出来后,就再把数字变为1,具体看代码;

#include<bits/stdc++.h>
using namespace std;
long long int sum,m,n,x,y,i,j;
char s[100800];
int main()
{
    scanf("%s",s);
    x=strlen(s)-1;
    i=1;
    while(1)
    {
        if(s[x]=='(')
        {
            i=1;
            x--;
        }
        if(x<0)break;
        if(s[x]=='H'){sum+=1*i;x--;}
        else if(s[x]=='O'){sum+=17*i;x--;}
        else if(s[x]=='C'){sum+=13*i;x--;}
        else if(s[x]>='0'&&s[x]<='9')
        {
            m=0;
            j=1;
            while(s[x]>='0'&&s[x]<='9')
            {
                m+=j*(s[x]-'0');
                j=j*10;
                x--;
            }
            if(s[x]=='H')sum+=m*i;
            else if(s[x]=='C')sum+=m*13*i;
            else if(s[x]=='O')sum+=m*17*i;
            else i=m;//这个就是数字外面是括号的情况;
            x--;
        }
        else x--;
    }
    cout<<sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值