课程首页 › 第3部分 › 第47课

第47课 谁是窃贼

第3部分 不辞辛苦 · 循环结构· 知识点:for循环、if语句、逻辑

谁是窃贼(for循环、if语句、逻辑)

插图

某银行被窃,甲、乙、丙、丁四人被涉嫌拘审。侦破结果表明,罪犯就是其中的某一个人。

警察逐一询问

甲说:“是丙偷的。”

乙说:“我没偷。”

丙说:“我也没偷。”

丁说:“如果乙没有偷,那么就是我偷的。”

现已査明,其中只有一个说了假话,你能找出谁是窃贼,又是谁说了假话吗?

逻辑思考

将甲、乙、丙、丁说的话,转成数字与程序,借助计算机的算力帮我们找出窃贼,揪出说谎者。

假设窃贼是x(一个变量),将甲、乙、丙、丁分别对应数字1、2、3、4。

●如果x等于1,那么窃贼就是甲。

●如果x等于2,那么窃贼就是乙。

●如果x等于3,那么窃贼就是丙。

●如果x等于4,那么窃贼就是丁。

现在我们在将他们说的话用程序语言表达一番:

(1)甲说:“是丙偷的。”如果甲是真话那么丙是窃贼,用程序表达为x==3。

插图

(2)乙说:“我没偷。”如果乙说的是真话,那么乙不是窃贼,可以表达为x!=2。

(3)丙说:“我也没偷。”如果丙说的是真话,那么可以表达为x!=3。

(4)丁说:“如果乙没偷,那么就是我偷的。”这是什么意思呢?直接用程序表达有点难了。这句话其实表示窃贼不是乙就是丁,程序表达为x==2||x==4,窃贼是乙或者是丁。

到这里程序完成了一半,继续分析。

其中只有一个说了假话。

插图

这些表达式中只有一个为false,其他为true,而true用数字1表示,false用数字是0表示。

只有一个false,那么这几个表达式相加的结果应该等于3:(x==3)+(x!=2)+(x!=3)+(x==2||x==4)==3。

而窃贼只有一个,将x从1到4逐一测试,只要满足只有一人说假话的条件,就能找到窃贼。

谁是窃贼

(1)for(int x=1;x<=4;x++){}:将甲、乙、丙、丁的数字代号逐一测试。

(2)(x==3)+(x!=2)+(x!=3)+(x==2||x==4)==3:将满足3句真话1句假话的情况下的x找出来。

(3)通过switch case输出窃贼。

(4)再将4句话进行逐一判断,找出不为真的那个人,就是说假话的那个人。

插图

运行程序:

丁是窃贼。

甲说的是假话。

插图

巩固练习

(1)以下程序运行后的结果是?()

插图

A.100

B.011

C.211

D.001

(2)阅读下面的程序,填写输出结果。

插图

输入:6

输出:_____________________________

输入:4

输出:____________________________

(3)烧脑继续:家里有4个孩子,分别是甲、乙、丙和丁。一天放学回来,餐桌上的糖果少了几颗,妈妈问是谁偷吃了糖果。

四个孩子各有说辞:

甲说:“我们中有人偷吃了糖果。”

乙说:“我们四个都没有偷吃糖果。”

丙说:“乙和丁至少有一人没有偷吃糖果。”

丁说:“我没有偷吃糖果。”

如果4个孩子中有两个说的是真话,有两个说的是假话,则说真话的是()。

A.说真话的是甲和丙

B.说真话的是甲和丁

C.说真话的是乙和丙

D.说真话的是乙和丁

再想想到底是谁偷吃了糖果,有多种可能吗?