题目地址:​​点击打开链接​

思路:调了3,4个小时才调出来,还是菜啊,各种细节基础问题出错,刚开始想着短一点,不枚举,后来快写完了才发现括号没考虑,后来想着括号里和括号外用同一个函数调用,懒得想了,直接爆吧,但是还得考虑括号外的数字,还得考虑整个式子前面的数字,剩下的就是最伤心的部分了,每次用的都是一个数组结果却用strlen求值,然后函数调用,结果数组的值就是不对,结果你懂的,后来数组的长度虽然对了,结果if-else语句控制的下标超出求的长度导致wrong,后来就在if语句里面又加一个判断条件,还有就是getchar()放到while语句里wrong了几发

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

using namespace std;

char a[55];
char b[55];
char c[55];

int qiu(char b[],int m)
{
int i;
int sum1 = 0,sum;
for(i=0; i<m; i++)
{
sum = 0;
if(b[i] == 'C' && b[i+1] == 'l')
{
sum += 35;
if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)//怕超出界限
{
sum *= (b[i+2] - '0');
i = i + 2;
}
else
{
i = i + 1;
}
}
else if(b[i] == 'A' && b[i+1] == 'l')
{
sum += 27;
if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
{
sum *= (b[i+2] - '0');
i = i + 2;
}
else
{
i = i + 1;
}
}
else if(b[i] == 'C' && b[i+1] == 'a')
{
sum += 40;
if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
{
sum *= (b[i+2] - '0');
i = i + 2;
}
else
{
i = i + 1;
}
}
else if(b[i] == 'Z' && b[i+1] == 'n')
{
sum += 65;
if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
{
sum *= (b[i+2] - '0');
i = i + 2;
}
else
{
i = i + 1;
}
}
else if(b[i] == 'N' && b[i+1] == 'a')
{
sum += 23;
if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
{
sum *= (b[i+2] - '0');
i = i + 2;
}
else
{
i = i + 1;
}
}
else if(b[i] == 'N')
{
sum += 14;
if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
{
sum *= (b[i+1] - '0');
i = i + 1;
}
}
else if(b[i] == 'C')
{
sum += 12;
if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
{
sum *= (b[i+1] - '0');
i = i + 1;
}
}
else if(b[i] == 'O')
{
sum += 16;
if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
{
sum *= (b[i+1] - '0');
i = i + 1;
}
}
else if(b[i] == 'S')
{
sum += 32;
if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
{
sum *= (b[i+1] - '0');
i = i + 1;
}
}
else if(b[i] == 'H')
{
sum += 2;
if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
{
sum *= (b[i+1] - '0');
i = i + 1;
}
}
sum1 += sum;
}
return sum1;
}


int main()
{
int i,j,k;
int t;
int cheng;
scanf("%d",&t);
getchar();//放到这里别放到while里面
while(t--)
{
cheng = 1;
gets(a);
int n = strlen(a);
k = 0;
for(i=0; i<n; i++)
{
if(a[i] == '=')
{
for(j=i+1; j<n; j++)
{
if(a[j] == '+')
break;
b[k++] = a[j];
}
break;
}
}//把括号和加号里面的字符串截出来
int sum = 0,sum1;
int m = k;
for(i=0; i<m; i++)
{
if(b[i] == '(')
{
sum1 = 0;
k = 0;
for(j=i+1; j<m; j++)
{
if(b[j] == ')')
break;
c[k++] = b[j];
}
sum1 = qiu(c,k);
j++;
if(b[j] >= '0' && b[j] <='9')
sum1 *= (b[j] - '0');
sum += sum1;
}
}//加上括号里面的值
if(b[0] >= '0' && b[0] <= '9')
{
cheng = b[0] - '0';
i = 1;
}
else
{
i = 0;
}
k = 0;//判断第一个是否为数字
for(; i<m; i++)
{
if(b[i] == '(')
{
i++;
while(1)
{
if(b[i] == ')')
break;
i++;
}
if(b[i+1] >= '0' && b[i+1] <= '9')
i += 1;
}
else
{
c[k++] = b[i];
}
}//加上括号外面的值
sum += qiu(c,k);
sum *= cheng;
printf("%04d\n",sum);
}
}