上海大学夏季赛(递归模拟题B分子)

题目链接
这个题干很好理解就是求一个化学式的相对分子质量,只是这里可能会存在括号的情况,起初我想的就是直接暴力模拟确实可以求解,但是赛后看了一个大佬的代码利用递归写的,刚好我的递归理解的一般所以就拿来学习一下,我们可以将问题转化为两个部分进行求解,括号内部和外部,这样递归的思路就有了,我们将括号内部看成一个整体利用外部的规则对内部进行分子质量的计算,然后在加到整体上面去,这样就可以完成对于全局的求解。看到这里如果大家没理解,我这里直接附上AC的代码分析:

#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
#define int ll
const int N = 100010 ;
string s ;
int i,len;
int work(){//该函数相当于求解整外部分子质量的函数
    int t = 0 , ans = 0 ;
    for( ; i < len ; i ++){
        int num = 0 ;
        while(s[i]>='0'&&s[i]<='9') {num = num * 10 + (s[i++] - '0');}
        //这个while循环用来计算某个整体或者单个原子的个数
        t = t * (num ? num : 1);
        //这里就是对原子个数进行处理如果为0就赋值为1
        ans += t ;
        //这里将整体的原子质量加到最终结果里面去
        t = 0 ;
        if(s[i] == 'C'){
            t = 13 ;
        }else if(s[i] == 'H'){
            t = 1 ;
        }else if(s[i] == 'O'){
            t = 17 ;
        }else if(s[i] == '('){
            i++;
            t = work();
            //这里可以说是整个代码的核心部分,这里是对于括号内部进行局部求解,利用外部·求解的规则
        }else{
            break;
            //这里就是遇到右括号我们就结束了局部的求解退出该循环
        }
    }
    ans += t ;
    //最后将局部救出的结果赋值给ans进行返回赋值给t变量
    return ans ;
}
int main(){
    cin >> s ;
    len = s.length();
    cout << work() << endl;
}

通过这道题确实加深了对于递归的理解,继续加油!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值