又是一道很恶心的模拟题
给出变量的值,计算给定的表达式,表达式中可能含常数
我替换表达式中变量的时候用的是暴力查找变量对应的常数
用map的话应该更快,但我map不太会用
所以用结构体暴力,好在没有超时
主要思想就是找出表达式中所有的变量,替换为对应的常数
代码如下:
#include <cctype>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 10010
#define ll long long
using namespace std;
char str[MAXN][20];
struct Point{
char op[20];
int v;
}a[MAXN];
int n;
int replace(char ch[]) {
int len = strlen(ch);
int value = 0;
int flag = 0;
if(len>1&&isdigit(ch[1])) {
if(ch[0] == '-')
flag = 1;
int t = 0;
if(flag == 1) t = 1;
for(int i=t; i<len; ++i) {
value = value*10+(ch[i]-'0');
}
if(flag)
value = -value;
return value;
}
else if(len==1 && isdigit(ch[0])) {
return (ch[0]-'0');
}
for(int i=n-2; i>=0; --i) {
if(strcmp(ch, a[i].op) == 0)
return a[i].v;
}
}
int main(void) {
int T;
cin >> T;
while(T--) {
cin >> n;
memset(a, 0, sizeof(a));
memset(str, 0, sizeof(str));
for(int i=0; i<n-1; ++i) {
scanf("%s", a[i].op);
getchar();getchar();getchar();
scanf("%d", &a[i].v);
// printf("%s = %d\n", a[i].op, a[i].v);
}
int sum = 0;
int k = 0;
char ch;
int flag;
scanf("%s", str[0]);
sum = replace(str[0]);
// cout << "str[0] = " << str[0] << endl;
getchar();
ch = getchar();
getchar();
if(ch == '+')
flag = 1;
else if(ch == '-')
flag = 0;
else if(ch == '=') {
cout << sum << endl;
continue;
}
while(1) {
scanf("%s", str[++k]);
// printf("str[%d] = %s\n", k, str[k]);
int t = replace(str[k]);
// cout << "t = " << t << endl;
if(flag == 1)
sum += t;
else sum -= t;
getchar();
ch = getchar();
getchar();
if(ch == '+')
flag = 1;
else if(ch == '-')
flag = 0;
else if(ch == '=') {
getchar();
getchar();
break;
}
}
cout << sum << endl;
}
return 0;
}