直接上分析:
首先 弄清各种大写字母的操作的实质
K 明显 是 and &
A 是 or |
N 是 not !
C 由表格注意到 当 w<=x 时 值为1
E 当 w==x 时 值 为1;
弄清了这些就把大写字母当做一个运算符,字符串作为一个前缀表达式来做
#include <iostream> #include <string> #include <stack> #define Det 112 using namespace std; int val[5]; string st; stack<int> inte; int main() { int len, k, m, x, y; while (cin >> st) { if (st[0] == '0') return 0; for (int n = 0; n <= 31; n++) { for (int i = 0, p = n; i <= 4; i++, p >>= 1) val[i] = p & 1; len = st.length(); for (int i = len - 1; i >= 0; i--) { if (st[i] >= Det) inte.push (val[st[i] - Det]); else if (st[i] == 'N') { x = inte.top(); inte.pop(); inte.push (!x); } else { x = inte.top(); inte.pop(); y = inte.top(); inte.pop(); if (st[i] == 'K') x = x & y; if (st[i] == 'A') x = x | y; if (st[i] == 'C') x = (x<=y); if (st[i] == 'E') x = (x ==y); inte.push (x); } } if (inte.top() == 0) { cout << "not" << endl; break; } else if (n == 31) cout << "tautology" << endl; } } return 0; }
http://www.cnblogs.com/keam37/ keam所有 转载请注明出处