Just determine whether an algebraic expression can always simplify to zero.
Input
Each test case starts with an integer N, the number of tokens that describes a formula. The next N tokens describe a formula in reverse polish notation.
The notation works as follows. There is a stack that begins empty, and only the following commands manipulate the contents of the stack:
1. “x” pushes the variable x to the stack.
2. “sin”, “cos”, and “tan” replace the top element of the stack with its sin, cos, and tan, respectively.
3. “+”, “-”, and “*” replace the top two elements of the stack (a on top, followed by b) with their sum(b + a), difference (b − a), and product (b ∗ a), respectively.
You may assume that the input is valid, and results in a single item on the stack, which is the desired expression. The length of a line will be at most 300 characters. Note function arguments can contain functions.
Output
Sample Input
3 x sin sin
15 x sin x sin * x cos x cos * + x * x -
Sample Output
Case 2: Yes
#include <stdio.h> #include <string.h> #include <algorithm> #include <stack> #include <math.h> using namespace std; #define pi acos(-1.0) stack<double> S; char str[305][10]; int main() { int t,n,i,j,cas = 1; int flag; double x,y,z; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i = 0; i<n; i++) scanf("%s",str[i]); flag = 1; for(x = -2.0; x<=2.0; x+=0.0001)//枚举x { for(j = 0; j<n; j++) { if(!strcmp(str[j],"x")) S.push(x); else if(!strcmp(str[j],"sin")) { y = S.top(); S.pop(); y = sin(y); S.push(y); } else if(!strcmp(str[j],"cos")) { y = S.top(); S.pop(); y = cos(y); S.push(y); } else if(!strcmp(str[j],"tan")) { y = S.top(); S.pop(); y = tan(y); S.push(y); } else if(!strcmp(str[j],"+")) { y = S.top(); S.pop(); z = S.top(); S.pop(); y = y+z; S.push(y); } else if(!strcmp(str[j],"-")) { y = S.top(); S.pop(); z = S.top(); S.pop(); y = z-y; S.push(y); } else if(!strcmp(str[j],"*")) { y = S.top(); S.pop(); z = S.top(); S.pop(); y = y*z; S.push(y); } } y = S.top(); S.pop(); if(fabs(y)<1e-8 && S.empty()) continue; else { flag = 0; break; } } printf("Case %d: ",cas++); if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }