题目描述:
在遥远的斯卡布罗集市,有机分子只能由 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^15。
输出描述:
在一行中输出一个整数,代表该分子的式量。
保证答案不超过 10^ 15 。
链接:https://ac.nowcoder.com/acm/contest/6871/B
来源:牛客网
示例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。
对于部分编程语言,请注意使用合适的数据类型以避免答案溢出。
**
在比赛的时候一直没过,捋不清楚它们的关系,看了别人的代码,终于捋清楚了
可以把整个分子式分块,把后面有数字的和括号括住的拎出来处理
仔细思考可以发现括号中的分子式和外面的处理方式相同
可以利用递归函数一直调用fun()函数对括号中的分子式进行处理
**
#include
using namespace std;
typedef long long ll;
ll lena,i;
char a[100006];
ll max(ll a,ll b)
{
return a > b ? a:b;
}
ll fun()
{
ll ans=0,t = 0;
for(i; i < lena;i ++)//注意这里从i开始,让i自由变化,不能让i=0
{
ll sum = 0;
while(a[i] >= '0'&&a[i] <= '9')//如果是数字的话,把整个数都算出来
//(可能是二位数,三位数,多位数)
{
sum=sum*10+a[i]-'0';
i++;
}
ans+= t * max(sum,1);//后面没有数字的话就*1,有数字的话就乘以数字
t = 0;//每轮对t初始化
if(a[i] == 'C') t = 13;
else if(a[i] == 'O') t=17;
else if(a[i] == 'H') t=1;
if (a[i] == '('){
i++; //从下一个字符开始
t=fun();//调用fun函数对括号中的分子式进行计算
}
else if(a[i] == ')') break;
}
ans+=t; //最后一个如果是字母或者括号括住的分子式,需要再加上去
return ans;
}
int main()
{
gets(a);
lena=strlen(a);
printf("%lld\n",fun());
return 0;
}