2020-08-05

链接: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,括号和数字以外的字符,且长度不超过 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<bits/stdc++.h>
using namespace std;

long long cnt,block,ans; 
//block存储一小串连续分子式的值,但 注意,这连续并不包括 括号
string s;
int main()
{
    cin>>s;
    int len = s.length();
    for(int i = 0; i < len; ){
        if(s[i] == 'C' || s[i] == 'H' || s[i] == 'O'){
            if(s[i] == 'C')cnt = 13;
            else if(s[i] == 'H')cnt = 1;
            else cnt = 17;
            i++;
            long long tmpnum = 0;
            while(i <len && s[i] >= '0' && s[i] <= '9'){
                tmpnum = tmpnum * 10 + s[i] - '0';
                i++;
            }
            if(!tmpnum) block += cnt;
            else block += cnt * tmpnum;
        }
        else if(i < len &&  s[i] == '('){	
 //括号用来分割 block同时将block加到答案里去
            ans += block;
            block = 0;
            i++;
        }
        else if(i < len && s[i] == ')'){
 //括号用来分割 block同时将block加到答案里去
            **long long** tmpnum = 0;     ***//即使是这里也要用上long long!!!!***
            i++;
            while(i < len && s[i] >= '0' && s[i] <= '9'){
                tmpnum = tmpnum * 10 + s[i] - '0';
                i++;
            }
            if(!tmpnum) ans += block;
            else ans += block * tmpnum;
            block = 0;
        }
    }
    ans += block;
    cout<<ans<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值