1.不需要考虑括号不匹配问题,输入绝对合法。
2.不需要考虑形如 (-3+a^7)*2 这样的情况。
3.另一方面,我认为只有试够11个数才能充分说明正确性:因为a^10+k9a^9+k8a^8+.......=(a+3)^10+......这是一个一元十次方程,它需要11个点来确定一条十次曲线。所以要将0-10都代入才能说明问题。当然,如果这是一条6次曲线,7个点就够,可是谁有想写一个判断次数的函数呢?
4.因为取余运算,导致运算顺序不同,结果就不同。这是一个神坑。所以试的点少一点 ,取余数大一点就容易过。
#includeusing namespace std;#define big 10007#define test 8char ti[51];//题干 int size;//选项个数int result[test];//准备试的数bool prior(char a, char b){//运算符a优先级是否大于b if (a == '^')return true; if (b == '^')return false; if (a == '*')return true; if (b == '*')return false; return true;}int power(int a, int b){//乘幂函数要取余 int i; int ans = 1; for (i = 0; i < b; i++){ ans *= a; ans %= big; } return ans;}int op(int a, int b, char o){ switch (o){ case '^':return power(a, b); case '*':a *= b; a %= big; return a; case '+':return (a + b) % big; case '-':return (a - b) % big; }}//x表示数字,o表示符号int calculate(int x[], int xsize, char o[], int osize){ int i; int xstack[51]; int xtop = 0; char ostack[51]; int otop = 0; int xi, oi; xi = oi = 0; xstack[xtop++] = x[xi++]; while (xi 0){ xstack[xtop - 2] = op(xstack[xtop - 2], xstack[xtop - 1], ostack[otop - 1]); xtop--; otop--; } return xstack[0];}int go(char ex[], int a){ int i, j; int x[51]; int xi = 0; char o[51]; int oi = 0; i = 0; while (ex[i]){ while (ex[i] == ' ')i++; if (ex[i] == 0)break; if (ex[i] == '('){ int left = 1; char temp[51]; j = 0; i++; while (true){ temp[j] = ex[i]; if (temp[j] == '(')left++; else if (temp[j] == ')')left--; if (left == 0){ temp[j] = 0; x[xi++] = go(temp, a); i++; break; } i++; j++; } } else if (ex[i] == 'a'){ x[xi++] = a; i++; } else{ int n = 0; while (ex[i] >= '0'&&ex[i] <= '9'){ n *= 10; n += ex[i] - '0'; i++; } x[xi++] = n; } while (ex[i] == ' ')i++; if (ex[i] == 0)break; if (ex[i] == '+' || ex[i] == '-' || ex[i] == '*' || ex[i] == '^'){ o[oi++] = ex[i]; } i++; } return calculate(x, xi, o, oi);}int main(){ freopen("in.txt", "r", stdin); cin.getline(ti, sizeof(ti)); cin >> size; int i; for (i = 0; i < test; i++) { result[i] = go(ti, i); } char choose[51]; cin.getline(choose, 55); for (i = 0; i < size; i++){ cin.getline(choose, 55); int j; int ans; for (j = 0; j < test; j++){ ans = go(choose, j); if (ans != result[j])break; } if (j == test){ cout << (char)(i + 'A'); } } return 0;}