题意:
输入由p、q、r、s、t、K、A、N、C、E共10个字母组成的逻辑表达式,
其中p、q、r、s
、t的值为1(true)或0(false),即逻辑变量;
K、A、N、C、E为逻辑运算符,
K --> and:x && y
A --> or:x || y
N --> not :! x
C --> implies :(!x)||y
E --> equals :x==y
问这个逻辑表达式是否为永真式。
题解:
用32进行位操作 判断五个逻辑变量 的真假
这里面 要注意一个小点 必须用 & 不可以用 && 必须用 | 不可以用||
&& 和 || 有短路性质
eg.在运行上,&两边的条件都要判断(不管前面的是ture还是false),而&&先判断前面的,若为false,则后面的不再判断。
/*
Algorithm: 暴力枚举
Author: anthony1314
Creat Time: 2019. 3 . 21
Time Complexity:
*/
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<cstring>
#include<cstdio>
//#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define mod 1e9 + 7
#define line printf("--------------");
using namespace std;
int cnt;
char str[101];
bool step(char str[101],int tk) {
cnt++;
switch(str[cnt]) {
case 'p':
return tk&1;
case 'q':
return(tk>>1)&1;
case 'r':
return(tk>>2)&1;
case 's':
return(tk>>3)&1;
case 't':
return(tk>>4)&1;
case 'N':
return !step(str,tk);
case 'K':
return step(str,tk)&step(str,tk);
case 'A':
return step(str,tk)|step(str,tk);
case 'C':
return !step(str,tk)|step(str,tk);
case 'E':
return step(str,tk)==step(str,tk);
}
}
bool judge(char str[101]) {
for(int i = 0; i < 32; i++) {
cnt = -1;//初始化
if(!step(str,i)) {
return 0;
}
}
return 1;
}
int main() {
while(cin>>str) {
if(str[0]=='0'){
break;
}
if(judge(str)){
cout<<"tautology"<<endl;
}
else{
cout<<"not"<<endl;
}
}
return 0;
}
/*
&是位运算符。&&是布尔逻辑运算符。
在运行上,&两边的条件都要判断(不管前面的是ture还是false),而&&先判断前面的,若为false,则后面的不再判断。
*/