这两天考试,一直没来得及写。。
看这道题的时候,我还是有点懵,看不懂,看到其他人讲解,才明白的
p,q,r,s,t,这5个字母为小写字母,会用到islower函数
K,A,N,C,E,这代表着运算符,且,或,非等
每个小写字母会有两种状态0,1;
输入一个字符串,判断他代表的是否(无论小写字母代表什么)都为真,若为假,输出not;
因为5个字母,每种两种状态,0,1,2^5,一共32种,可采用位运算;
这里有两个点比较重要,也是精华
@1
0-31:
t s r q p
0:0 0 0 0 0 0 0 0
1:0 0 0 0 0 0 0 1
2:0 0 0 0 0 0 1 0
3:0 0 0 0 0 0 1 1
4:0 0 0 0 0 1 0 0
5:0 0 0 0 0 1 0 1
6:0 0 0 0 0 1 1 0
31:0 0 0 0 1 1 1 1 1 1+2+4+8+16=31
拿5和31举例;
5: 0 0 1 0 1
t==0,s==0,r==1,q==0,p==1;
31:1 1 1 1 1
t==1,s==1,r==1,q==1,p==1;
这样32种状态就都可以表示;
@2
&运算符
>>运算符
>>左移运算符;
5>>0 0 0 1 0 1
5>>1 0 0 0 1 0
5>>2 0 0 0 0 1
5>>3 0 0 0 0 0
&运算符:取最后一位
(5>>0)&1==1 0 0 1 0 1
(5>>1)&1==0 0 0 0 1 0
(5>>2)&1==1 0 0 0 0 1
(5>>3)&1==0 0 0 0 0 0
代码:
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int val;
string s;
int eval(int &x)
{
char ch=s[x++];
if(islower(ch)) return (val>>(ch-'p'))&1;//5位上的数表示相应的+,—
if(ch=='N') return !eval(x);
int v1=eval(x) ,v2=eval(x);
if(ch=='K') return v1&v2;
if(ch=='A') return v1|v2;
if(ch=='C') return !v1|v2;
if(ch=='E') return v1==v2;
}
int main()
{
int x;
while(cin>>s&&s!="0")
{
for(val=0;val<32;val++)
if(!eval(x=0)) break;
if(val<32) cout<<"not"<<endl;
else cout<<"tautology"<<endl;
}
return 0;
}
@2