本期介绍🍖
在实际生活中我们往往会遇到一些逻辑性难题,往往不能够一眼就看出问题的答案,而是需要严谨的逻辑推导才能够求出解。同样我们也能够用编程的思维方式来解决这些问题。
1. 喝汽水问题
问题: 一瓶汽水1元,两个空瓶可以换1瓶汽水,现有20元现金,问可以喝多少瓶汽水?(请编写一个程序来求出最后结果)
通过上面绘图分析,编写程序如下:
#include<stdio.h>
int main()
{
int yuan = 0;
int drink = 0;
int bottle = 0;
//输入初始金额
scanf("%d", &yuan);
//用钱买汽水
drink = yuan;
bottle = drink;
//用空瓶换取汽水
while (bottle >= 2)
{
//喝到的汽水
drink += bottle / 2;
//剩余空瓶
bottle = (bottle / 2) + (bottle % 2);
}
printf("%d ", drink);
return 0;
}
其实本质上20元可以喝到40瓶汽水,怎么做呢?你带着之前剩余最后的那个空瓶去找老板说:“先赊账一瓶汽水”。吨吨吨的喝完那瓶汽水后说:“老板还账”,给老板两个空瓶。(这就是江湖中流传着的空手套白狼一说😃😃😃😃😃)
2. 猜凶手问题
某地发生了一起凶杀案,警察通过排查确定杀人凶手必为4个嫌疑犯中的一个。以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说。
已知3个人说了真话,1个人说了假话。请编程来确定谁是凶手。
大家侦探小说都看过吧,那些侦探一定都是先大胆假设然后再通过已知的一些条件来逐步验证自己的猜想,最终做到侦破案件的。所以对于这道题首先就要进行假设,然后再逐步判断直至满足一直条件,则凶手找到。(举个例子:如我先假设A是那个杀人犯吧,然后再把这个条件带入4个嫌疑犯的供词中,满足3真1假那凶手就找到了)
代码如下:
#include<stdio.h>
int main()
{
char murder = 0;
for (murder = 'A'; murder <= 'D'; murder++)
{
if ((murder != 'A') +
(murder == 'C') +
(murder == 'D') +
(murder != 'D') == 3)
printf("%c是杀人犯\n", murder);
}
return 0;
}
3. 猜名次问题
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果,比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
A选手说:B第1,我第3;
B选手说:我第2,E第4;
C选手说:我第1,D第2;
D选手说:C最后,我第3;
E选手说:我第4,A第1;
如果这个问题让你纯靠想像你能看出比赛的名次吗?答案当然是否定的。这题的解题思路还是与第一题一样,先假设再求证,只不过这题需要穷举每一种排名的可能性才行。
代码如下:
#include<stdio.h>
int main()
{
//创建A,B,C,D,E五个运动员
int A, B, C, D, E;
//穷举出每个运动员排名的可能性
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 + C + D + E == 15)
{
//每个运动员的判断
if (((B == 2) + (A == 3)) == 1 &&
((B == 2) + (E == 4)) == 1 &&
((C == 1) + (D == 2)) == 1 &&
((C == 5) + (D == 3)) == 1 &&
((E == 4) + (A == 1)) == 1)
printf("A=%d, B=%d, C=%d, D=%d, E=%d\n", A, B, C, D, E);
}
}
}
}
}
}
return 0;
}
这份博客👍如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧👀。