??前面的話??
嗨嘍!我要來水文章咯!上一篇文章介紹了C語言庫中一些關于字符的函式和深入了解了指標,相信大家都看累了,這篇文章博主將分享兩個有趣的問題找兇手和比賽名次,讓學習C語言不枯燥,
📒博客主頁:未見花聞的博客主頁
🎉歡迎關注🔎點贊👍收藏??留言📝
📌本文由未見花聞原創,CSDN首發!
??堅持和努力一定能換來詩與遠方!
🙏作者水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!
博主的碼云gitee,平常博主寫的程式代碼都在里面,
🔐問題1:找兇手
日本某地發生了一件謀殺案,警察通過排查確定殺人兇手必為4個嫌疑犯的一個,
以下為4個嫌疑犯的供詞:
A說:不是我,
B說:是C,
C說:是D,
D說:C在胡說,
已知3個人說了真話,1個人說的是假話,
現在請根據這些資訊,寫一個程式來確定到底誰是兇手,
💡解題思路
首先根據我們人類的思維可以確定一共有4種情況將這些情況列成一個表(其中1代表真,0代表假):
| A | B | C | D | 推斷 |
|---|---|---|---|---|
| 0 | 1 | 1 | 1 | C,D矛盾 |
| 1 | 0 | 1 | 1 | C,D矛盾 |
| 1 | 1 | 0 | 1 | C是兇手 |
| 1 | 1 | 1 | 0 | B,C矛盾 |
根據推理:
B,C中必有一個說謊;
C,D中必有一個說謊;
A,D說的一定是真話,
所以推斷出C是兇手,
人類可以通過像這樣的推理得到誰是兇手,但是計算機不行,它沒有人類的思維,所以想要使用編程解決這道題,必須從計算機的角度出發,以計算機的思維解決,
通過題目可知四句話三真一假,所以我們可以通過設立四個判斷陳述句,滿足四個判斷陳述句結果之和為3,這就模擬了三真一假,
對于判斷陳述句,A,B,C,D四個人的話翻譯一下可以得到:
A:murderer != 'A'
B:murderer == 'C'
C:murderer == 'D'
D:murderer != 'D'
我們可以假設一個兇手,比如從A開始,然后進行四個條件判斷并將其結果加起來,如果滿足判斷結果之和為3,則A就是兇手,
🔑編程代碼與運行結果
編程代碼:
#include <stdio.h>
int main()
{
int i = 0;
char murderer = 'A';
for (i = 0; i < 4; i++)
{
murderer = 'A' + i;//假設兇手是A
int sum = 0;
sum = (murderer != 'A') + (murderer == 'C') + (murderer == 'D') + (murderer != 'D');//它們四個人三個人說了真話
if (sum == 3)
{
printf("%c是兇手,\n", murderer);//C是兇手
break;
}
}
return 0;
}
運行結果:
C是兇手,
D:\gtee\C-learning-code-and-project\猜兇手\Debug\猜兇手.exe (行程 29596)已退出,代碼為 0,
按任意鍵關閉此視窗. . .
與我們想的一致,完成!
🔐問題2:比賽名次
5位運動員參加了10米臺跳水比賽,有人讓他們預測比賽結果:
A選手說:B第二,我第三;
B選手說:我第二,E第四;
C選手說:我第一,D第二;
D選手說:C最后,我第三;
E選手說:我第四,A第一;
比賽結束后,每位選手都說對了一半,請編程確定比賽的名次,
💡解題思路
用計算機的思維,首先將5位運動員講的話以說對一半的形式翻譯成5個判斷陳述句,這里所謂的“說對一半”,就是5位運動員中一句話為真,一句話為假,翻譯成判斷陳述句如下:
A = (((b == 2) && (a == 3)) == 0) && (((b == 2) || (a == 3)) == 1);
B = (((b == 2) && (e == 4)) == 0) && (((b == 2) || (e == 4)) == 1);
C = (((c == 1) && (d == 2)) == 0) && (((c == 1) || (d == 2)) == 1);
D = (((c == 5) && (d == 3)) == 0) && (((c == 5) || (d == 3)) == 1);
E = (((e == 4) && (a == 1)) == 0) && (((e == 4) || (a == 1)) == 1);
滿足A+B+C+D+E==5或A*B*C*D*E=1就能模擬5位運動員說的話了,
或
A = (b == 2) + (a == 3);
B = (b == 2) + (e == 4);
C = (c == 1) + (d == 2);
D = (c == 5) + (d == 3);
E = (e == 4) + (a == 1);
滿足A*B*C*D*E=1就能模擬5位運動員說的話了,
然后就是將所有的可能情況列出來,去通過這5個判斷,如果滿足A*B*C*D*E=1就能得到比賽的名次,
對于怎么得出所有的比賽名次情況,有兩種方法:
方法1:使用5個嵌套的回圈將所有1 2 3 4 5名次組合數得出來,但是名次是不能出現重復的,那我們就將得到的組合數全部乘起來,如果結果等于1*2*3*4*5=120,就滿足得到的組合數每個都不相同,這樣名次就不會重復了,
方法2:使用亂數,得到5個范圍為1~5的數,同理為了避免名次重復,通過判斷5個數的乘積結果是否為120,來篩選沒有重復數字的組合,
🔑編程代碼與運行結果
方法1編程代碼:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int A = 0;
int B = 0;
int C = 0;
int D = 0;
int E = 0;
int test = 0;
for (a = 1; a <= 5; a++)
{
for (b = 1; b <= 5; b++)
{
for (c = 1; c <= 5; c++)
{
for (d = 1; d <= 5; d++)
{
for (e = 1; e <= 5; e++)
{
if (a * b * c * d * e == 120)//生成五位選手所有排名可能
{
A = (((b == 2) && (a == 3)) == 0) && (((b == 2) || (a == 3)) == 1);
B = (((b == 2) && (e == 4)) == 0) && (((b == 2) || (e == 4)) == 1);
C = (((c == 1) && (d == 2)) == 0) && (((c == 1) || (d == 2)) == 1);
D = (((c == 5) && (d == 3)) == 0) && (((c == 5) || (d == 3)) == 1);
E = (((e == 4) && (a == 1)) == 0) && (((e == 4) || (a == 1)) == 1);
//A = (b == 2) + (a == 3);
//B = (b == 2) + (e == 4);
//C = (c == 1) + (d == 2);
//D = (c == 5) + (d == 3);
//E = (e == 4) + (a == 1);
//test = A + B + C + D + E;//滿足五位選手說的話半句真半句假,后面判斷條件要要改為test == 5;
test = A * B * C * D * E;//滿足五位選手說的話為半真
if (a * b * c * d * e == 120)
{
if (test == 1)
{
printf("A->%d B->%d C->%d D->%d E->%d\n", a, b, c, d, e);
break;
}
}
}
}
}
}
}
}
return 0;
}
方法1運行結果:
A->3 B->1 C->5 D->2 E->4
D:\gtee\C-learning-code-and-project\test_809\Debug\test_809.exe (行程 20136)已退出,代碼為 0,
按任意鍵關閉此視窗. . .
方法2編程代碼:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int A = 0;
int B = 0;
int C = 0;
int D = 0;
int E = 0;
int test = 0;
srand((unsigned int)time(NULL));
while(1)
{
a = rand() % 5 + 1;
b = rand() % 5 + 1;
c = rand() % 5 + 1;
d = rand() % 5 + 1;
e = rand() % 5 + 1;//利用亂數生成五位選手排名可能情況
if (a * b * c * d * e == 120)
{
//A = (((b == 2) && (a == 3)) == 0) && (((b == 2) || (a == 3)) == 1);
//B = (((b == 2) && (e == 4)) == 0) && (((b == 2) || (e == 4)) == 1);
//C = (((c == 1) && (d == 2)) == 0) && (((c == 1) || (d == 2)) == 1);
//D = (((c == 5) && (d == 3)) == 0) && (((c == 5) || (d == 3)) == 1);
//E = (((e == 4) && (a == 1)) == 0) && (((e == 4) || (a == 1)) == 1);
A = (b == 2) + (a == 3);
B = (b == 2) + (e == 4);
C = (c == 1) + (d == 2);
D = (c == 5) + (d == 3);
E = (e == 4) + (a == 1);
test = A * B * C * D * E;//滿足五位選手說的話為半真
if (test == 1)
{
printf("A->%d B->%d C->%d D->%d E->%d\n", a, b, c, d, e);//如果得出排名列印并退出回圈
break;
}
}
}
return 0;
}
方法2運行結果:
A->3 B->1 C->5 D->2 E->4
D:\gtee\C-learning-code-and-project\test_809\Debug\test_809.exe (行程 31128)已退出,代碼為 0,
按任意鍵關閉此視窗. . .
兩種方法結果一致,都得到了五位比賽選手的排名,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294518.html
標籤:其他
上一篇:github開發人員在七夕搞事情:remote: Support for password authentication was removed on August 13, 2021.
