题意 给你一个表达式 只包含 + - 正整数 让你判断表达式是否成立 若成立 输出表达式的值 不成立输出 Invalid Expression! 思路: 首先判断是否成立 成立 则 优先进行乘法 最后累加 ACcode:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define mmax 10010 #define inf 0x3fffffff struct Bignum { int Sz; int num[mmax]; void print() { if (Sz - 1 < 0) printf("0"); for (int i = Sz - 1; i >= 0; i--) printf("%d", num[i]); printf("\n"); } Bignum() { Sz = 0; memset(num, 0, sizeof num); } void clear() { Sz = 0; memset(num, 0, sizeof num); } Bignum(int sz, int *a) { Sz = sz; memset(num, 0, sizeof num); for (int i = 0; i<Sz; i++) num[i] = a[i]; } Bignum(int x) { Sz = 0; memset(num, 0, sizeof num); while (x) { num[Sz++] = x % 10; x /= 10; } } Bignum operator + (const Bignum &a) { int tmp[mmax]; memset(tmp, 0, sizeof tmp); int len = max(Sz, a.Sz); for (int i = 0; i<len; i++) { tmp[i] += num[i] + a.num[i]; tmp[i + 1] += tmp[i] / 10; tmp[i] %= 10; } return Bignum(len + (tmp[len] ? 1 : 0), tmp); } Bignum operator * (const Bignum &a) { int tmp[mmax]; memset(tmp, 0, sizeof tmp); for (int i = 0; i<Sz; i++) for (int j = 0; j<a.Sz; j++) tmp[i + j] += num[i] * a.num[j]; for (int i = 0; i<Sz + a.Sz; i++) { tmp[i + 1] += tmp[i] / 10; tmp[i] %= 10; } for (int i = Sz + a.Sz - 1; i >= 0; i--) { if (tmp[i]) return Bignum(i + 1, tmp); } return Bignum(1, tmp); } }; Bignum Big[30]; int main() { int T; int Case = 0; while (scanf("%d", &T) != EOF) { int cnt = 0; int k = 0, k1 = 0, k2 = 0, k3 = 0; Big[0].clear(); while (T--) { char task[1010]; scanf("%s", task); int num; if (sscanf(task, "%d", &num) == 1) { Bignum Mid(num); if (k3 == 1) { Big[cnt] = Big[cnt] * Mid; k3 = 0; } else Big[++cnt] = Mid; k1++; } else if (task[0] == '+' || task[0] == '*') { if (task[0] == '*') k3 = 1; k2++; } if (k1 - k2 > 1 || k1 - k2 < 0) k = 1; } printf("Case %d: ", ++Case); if (k1 - k2 == 1 && k == 0) { for (int i = 1; i <= cnt; i++) { Big[0] = Big[0] + Big[i]; } Big[0].print(); } else printf("Invalid Expression!\n"); } return 0; }