《C語言及程式設計》實踐參考——誰是小偷
阿新 • • 發佈:2019-01-27
【專案8-誰是小偷】
警察局抓住了A、B、C、D四名盜竊嫌疑犯,其中只有一人是小偷。在審問時,A說:“我不是小偷”;B說:“C是小偷”;C說:“小偷肯定是D”;D說:“C在冤枉好人”。現在已經知道這四人中有三人說的是真話,一人說的是假話。請問到底誰是小偷?
提示:設4個變數a,b,c,d,為0時表示不是小偷,為1時表示是小偷,用四重迴圈窮舉a,b,c,d可能的取值的組合,對每一種組合判斷其是否符合題目中給出的約束。最後結論:C是小偷。
[參考解答]
下面一個程式的寫法中,注意“4人的說法中有3個真的”(即if語句部分)的寫法。
例:從下表可以看出,a==0及a!=1的值,完全等價於!a,這樣的寫法在C語言程式中大量使用。而c==1這樣的表示式,完全可以用c代替。
於是有:
警察局抓住了A、B、C、D四名盜竊嫌疑犯,其中只有一人是小偷。在審問時,A說:“我不是小偷”;B說:“C是小偷”;C說:“小偷肯定是D”;D說:“C在冤枉好人”。現在已經知道這四人中有三人說的是真話,一人說的是假話。請問到底誰是小偷?
提示:設4個變數a,b,c,d,為0時表示不是小偷,為1時表示是小偷,用四重迴圈窮舉a,b,c,d可能的取值的組合,對每一種組合判斷其是否符合題目中給出的約束。最後結論:C是小偷。
[參考解答]
#include <stdio.h> int main() { int a,b,c,d; for(a=1;a>=0;a--) //窮舉每個人是否是小偷的所有情況 for(b=1;b>=0;b--) //1:是小偷 0:不是 for(c=1;c>=0;c--) for(d=1;d>=0;d--) if((a==0)+(c==1)+(d==1)+(d==0)==3&&a+b+c+d==1) //4人的說法中有3個真的,且只有一個小偷 { printf("A: %d, B: %d, C: %d, D: %d\n", a, b, c, d); } return 0; }
下面一個程式的寫法中,注意“4人的說法中有3個真的”(即if語句部分)的寫法。
例:從下表可以看出,a==0及a!=1的值,完全等價於!a,這樣的寫法在C語言程式中大量使用。而c==1這樣的表示式,完全可以用c代替。
a | !a | a==0 | a!=1 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
於是有:
#include <stdio.h> int main() { int a,b,c,d; for(a=1; a>=0; a--) //窮舉每個人是否是小偷的所有情況 for(b=1; b>=0; b--) //1:是小偷 0:不是 for(c=1; c>=0; c--) for(d=1; d>=0; d--) if((!a)+(c)+(d)+(!d)==3&&a+b+c+d==1) //!a與a==0或a!=1完全等價,其他同 { printf("A: %d, B: %d, C: %d, D: %d\n", a, b, c, d); } return 0; }