一到逻辑题的编程解答

本文介绍了一种使用数理逻辑解决逻辑题的方法,并通过具体的编程实现展示了如何确定四位同学中谁说了真话。通过构造命题及命题间的关系,利用C++实现了逻辑判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上个星期在csdn论坛上看到的一道逻辑题(http://community.youkuaiyun.com/Expert/topic/5412/5412984.xml?temp=.2942469)

有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。
A说:不是我。
B说:是C。
C说:是D。
D说:他胡说。

(有一个人说的是假话)
这样子的题怎么编程呢?

------------------------------------------------------------------------

以下是我的回复:

这种问题还是要用数理逻辑方面的知识来编程。
设定以下4个命题:
p = 不是我;
q = 是C
r = 是D
s = 她胡说

根据他们的说法,可以得到如下关系:
q 蕴含 p
r 蕴含 p
q 异或于 r
s 与r是非的关系

另外还有一个非常重要的关系,就是p,q,r,s只能有一个为假,其余都为真。

下面是上述关系的函数表示:
bool implication(bool A,bool B)     //A蕴含B
{
 if((A==true)&&(B==false))
  return false;
 else
  return true;
}

bool Xor(bool A,bool B)                  //A异或于B
{
 return A^B;
}
bool Not(bool A,bool B)                  //A is not B
{
 if(A==(!B))
  return true;
 else
  return false;
}

下面是源代码:

#include<iostream>

using namespace std;

bool implication(bool A,bool B)
{
 if((A==true)&&(B==false))
  return false;
 else
  return true;
}

bool Xor(bool A,bool B)
{
 return A^B;
}

bool Not(bool A,bool B)
{
 if(A==(!B))
  return true;
 else
  return false;
}


int main()
{
 bool p,q,r,s;
 
 int a[4]={0x7,0xB,0xD,0xE};   //p,q,r,s中只能有一个0,因此做此限定
 
 for(int n=0;n<4;n++)
 {

 p = 0x1&a[n];
 q = 0x2&a[n];
 r = 0x4&a[n];
 s = 0X8&a[n];
  
if(Not(s,r)&&Xor(q,r)&&implication(q,p)&&implication(r,p)&&implication(q,s))
  cout << p << " " << q << " " << r << " " << s << endl;
  
 }
 system("pause");
 return 0;
}

以上求出的是命题p,q,r,s符合题意的真假情况。

对于这种逻辑问题,一般的编程规律就象楼上几位说的,先根据陈述句构造命题,然后根据命题之间的关系以及命题真值表的组合求得最有可能的一种真假关系。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值