谁是作案者 问题:
(1)营业员 A 或 B 偷了手表;
(2)若A作案,则作案不在营业时间;
(3)若B 的证据正确,则货柜末上锁;
(4)若B 的证据不正确,则作案在营业时间;
(5)货柜上了锁。
编写程序得出谁是作案者
分析:
①由第5个条件可确定,货柜上了锁,那么我们这里假设 d 代表货柜是否上了锁
即可得 d = 1
②由第1个条件确定作案者范围,要么是 A,要么是 B
即 A = 1 时,B = 0;
A = 0 时,B = 1;
③按照我们人脑的逻辑就是,由于确定货柜上了锁(第5个条件),所以由第3个条件反推 B 的证据不正确( B 是作案者 );于是由第4个条件,作案不在营业时间;于是由第2个条件反证 A 不是作案者(验证了推理的正确性)
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main ( )
{
int A, B; // A,B 两个人
int c, d = 1, e; // c 代表作案是否在营业时间,d 代表货柜是否上锁,e 代表 B 的证据是否正确
for ( c = 0; c <= 1; ++ c )
{
if ( c ) // 作案不在营业时间
{
A = 1; // A 作案
}
else // 作案在营业时间
{
A = 0; // A 不作案
e = 0; // B 的证据不正确
}
if ( d ) // 货柜上了锁
{
e = 0;
}
else // 货柜没上锁
{
e = 1;
}
if ( e ) // B 的证据正确
{
B = 0; // B 不是作案者
}
else // B 的证据不正确
{
B = 1; // B 不是作案者
}
if ( A && !B )
{
puts ( "A 是作案者!" );
}
if ( B && !A )
{
puts ( "B 是作案者!" );
}
}
return 0;
}