poj Tautology 构造法 递归 位运算 暑假第6题

这两天考试,一直没来得及写。。

看这道题的时候,我还是有点懵,看不懂,看到其他人讲解,才明白的

p,q,r,s,t,5个字母为小写字母,会用到islower函数

K,A,N,C,E,这代表着运算符,且,或,非等

每个小写字母会有两种状态01

输入一个字符串,判断他代表的是否(无论小写字母代表什么)都为真,若为假,输出not;

因为5个字母,每种两种状态,012^5,一共32种,可采用位运算;

这里有两个点比较重要,也是精华

 

@1  

0-31:  

                  t  s   r  q p

00 0 0 0 0 0 0 0

10 0 0 0 0 0 0 1

20 0 0 0 0 0 1 0

30 0 0 0 0 0 1 1

40 0 0 0 0 1 0 0

50 0 0 0 0 1 0 1

60 0 0 0 0 1 1 0

31:0 0 0 0 1 1 1 1 1 1+2+4+8+16=31

531举例;

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

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值