#include<cstdio>
#include<cstring>
using namespace std;
struct abc
{
int num;
char s[25];
}abc[1000000];
int change(int len, char s[] )
{
int ans=0, a, b, c=1;
if(s[0]=='-')
{
for(int i=len-1; i>0; i--)
{
a=(s[i]-'0')*c;
ans+=a;
c*=10;
}
return -ans;
}
for(int i=len-1; i>=0; i--)
{
a=(s[i]-'0')*c;
ans+=a;
c*=10;
}
//printf("ch ans = %d\n", ans);
return ans;
}
int main()
{
int t, n, ans=0;
char z, k[25];
scanf("%d", &t);
while(t--)
{
memset(k, 0, sizeof(k));
ans=0;
scanf("%d", &n);
for(int i=0; i<n-1; i++)
{
scanf("%s = %d", abc[i].s, &abc[i].num);
//printf("%s = %d\n",abc[i].s,abc[i].num );
}
scanf("%s", k);
if(k[0]>='a' && k[0]<='z')
{
for(int i=n-1; i>=0; i--)
{
if(k[0]!=abc[i].s[0])
continue;
else if(!strcmp(k, abc[i].s))
{
ans+=abc[i].num;//printf("abc[i].num= %d\n",abc[i].num );
break;
}
}
}
else
{//printf("csdcasd\n");
int len=strlen(k);
int ch=change(len, k);
ans+=ch;
}//printf("1.ans= %d\n", ans);
while(scanf(" %c %s", &z, k))
{
if(z=='=')
break;
if(k[0]>='a' && k[0]<='z')
{
for(int i=n-1; i>=0; i--)
{
if(k[0]!=abc[i].s[0])
continue;
else if(!strcmp(k, abc[i].s))
{
if(z=='+')
ans+=abc[i].num;//printf("abc[i].num= %d\n",abc[i].num );
else
ans-=abc[i].num;//printf("abc[i].num= %d\n",abc[i].num );
break;
}
}
}
else
{//printf("csdcasd\n");
int len=strlen(k);
int ch=change(len, k);
if(z=='+')
ans+=ch;
else
ans-=ch;
}
}
//scanf("%c", &z);
printf("%d\n", ans);
}
return 0;
}
先输入变量名即其对应的值, 用结构体数组储存;
然后输入要求解的表达式(数字、字符都当做字符输入), 判断输入的是数字还是变量名, 如果是变量名则用ans加上变量名对应的数值, 如果是数值则把数字字符转化成数值;
判断输入的是+还是-(一开始忘记了-的情况)
输入’=’时结束。
因为没理解透题意, 边写边想, 浪费了较多时间, 中间一些低级错误也浪费了很多时间