本文主要是介绍poj Tautology 构造法 递归 位运算 暑假第6题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这两天考试,一直没来得及写。。
看这道题的时候,我还是有点懵,看不懂,看到其他人讲解,才明白的
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
这篇关于poj Tautology 构造法 递归 位运算 暑假第6题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!