传送门(南阳理工的oj不支持#ifndef ONLINE_JUDGE (○´・д・)ノ)
直接分情况讨论就行了,看每次读的是字符还是数字
我以前写过一个递归版本的,即递归函数的参数是一个字符串,函数的功能是就算分子量的大小,如果读到一个括号,就把括号里面的那段字符串作为参数,继续调用这个函数,这样可以解决有多重括号的问题,不过这道题目简单了,题目说明只有一层括号,但是用递归的方法写代码量会减少。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define N 30
#define ll long long
using namespace std;
int main()
{
//#ifndef ONLINE_JUDGE
// freopen("1.txt", "r", stdin);
//#endif
int i, j, k, l, ans, cnt, num, temp;
char str[55], t[55];
scanf("%d", &k);
while(k--){
scanf("%s", t);
l = strlen(t);
for (i = 0; i < l; i++){
if (t[i] == '='){
break;
}
}
i++;
memset(str, 0, sizeof(str));
for (j = 0; i < l && t[i] != '+'; i++, j++){
str[j] += t[i];
}
ans = 0;
cnt = 1;
l = j;
i = 0;
if (str[i] <= '9'){
int tmp = 1;
temp = 0;
while(str[i] <= '9'){
temp += tmp*(str[i]-'0');
i++;
}
}else{
temp = 1;
}
num = 0;
while(i < l){
if (str[i] == '('){
i++;
num = 0;
int t1, t2, t3;
t1 = t2 = t3 = 0;
while(str[i] != ')'){
if (str[i] >= '0' && str[i] <= '9'){
int tmp = 1;
t3 = 0;
while(i < l && str[i] >= '0' && str[i] <= '9'){
t3 += tmp*(str[i]-'0');
i++;
}
t1 += t2*t3;
}else{
switch(str[i]){
case 'O':i++; t2 = 16; if (str[i] == ')' || str[i] > 'A') t1 += t2; break;
case 'S':i++; t2 = 32; if (str[i] == ')' || str[i] > 'A') t1 += t2; break;
case 'H':i++; t2 = 2; if (str[i] == ')' || str[i] > 'A') t1 += t2; break;
case 'N':i++;
if (str[i] == 'a') t2 = 23, i++;
else t2 = 14;
if (str[i] == ')' || str[i] > 'A') t1 += t2; break;
case 'C':i++;
if (str[i] == 'l') {
t2 = 35;
i++;
}
else t2 = 12;
if (str[i] == ')' || str[i] > 'A') t1 += t2; break;
case 'A':i+=2; t2 = 27; if (str[i] == ')' || str[i] > 'A') t1 += t2; break;
case 'Z':i+=2; t2 = 65; if (str[i] == ')' || str[i] > 'A') t1 += t2; break;
}
}
}
num = t1;
if (i == l-1 || str[i+1] >= 'A'){
ans += num;
}
i++;
}else if (str[i] >= '0' && str[i] <= '9'){
int tmp = 1;
cnt = 0;
while(i < l && str[i] >= '0' && str[i] <= '9'){
cnt += tmp*(str[i]-'0');
i++;
}
ans += num*cnt;
}else{
switch(str[i]){
case 'O':i++; num = 16; if (i == l || str[i] > 'A') ans += num; break;
case 'S':i++; num = 32; if (i == l || str[i] > 'A') ans += num; break;
case 'H':i++; num = 2; if (i == l || str[i] > 'A') ans += num; break;
case 'N':i++;
if (str[i] == 'a') num = 23, i++;
else num = 14;
if (i == l || str[i] > 'A') ans += num; break;
case 'C':i++;
if (str[i] == 'l') {
num = 35;
i++;
}else if (str[i] == 'a'){
num = 40;
i++;
}else num = 12;
if (i == l || str[i] > 'A') ans += num; break;
case 'A':i+=2; num = 27; if (i == l || str[i] > 'A') ans += num; break;
case 'Z':i+=2; num = 65; if (i == l || str[i] > 'A') ans += num; break;
}
}
}
ans = ans*temp;
printf("%04d\n", ans);
}
return 0;
}