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; }