B 模拟题

同源

https://ac.nowcoder.com/acm/contest/6871/A

#include<iostream>
#include<string>
using namespace std;
typedef long long ll;
int main() {
    string s;
    ll ans = 0, cnt = 0, res = 0;
    ll sum = 0;
    cin >> s;
    int len = s.length();
    // 主要思想 将字符串用括号来进行分割成一段一段
    for(int i = 0; i < len;) {
        if(s[i] == 'C' || s[i] == 'O' || s[i] == 'H') {
            if(s[i] == 'C') cnt = 13;
            if(s[i] == 'O') cnt = 17;
            if(s[i] == 'H') cnt = 1;
            i++;
            res = 0;
            while(i < len && s[i] >= '0' && s[i] <= '9')
                res = res*10 + s[i++]-'0';
            if(!res) ans += cnt; // 判断字母后面有没有数字
            else ans += cnt*res; // 把目前求出来的数加到ans
        }
        else if(i < len && s[i] == '(') { // 前面的一段结束了,到新一段
            sum += ans; // 将暂存数ans保存到总数sum
            ans = 0; // 清零
            i++;
        }
        else if(i < len && s[i] == ')') { // 表示括号这一段已经结束
            i++;
            res = 0;
            while(i < len && s[i] >= '0' && s[i] <= '9')
                res = res*10 + s[i++]-'0';
            if(!res) sum += ans; // 判断括号后面有没有数字
            else sum += ans*res;// 将暂存数ans保存到总数sum
            ans = 0; // 清零
        }
    }
    sum += ans; // 把最后一段加上, 如果最后是括号加上 0 不影响结果
    cout << sum << endl;
    return 0;
}


全部评论

相关推荐

点赞 评论 收藏
分享
评论
6
收藏
分享
牛客网
牛客企业服务