完整代码
猜名次
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 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 == 3) + (b == 2) == 1
&& (b == 2) + (e == 4) == 1
&& (c == 1) + (d == 2) == 1
&& (c == 5) + (d == 3) == 1
&& (e == 4) + (a == 1) == 1
&& a * b * c * d * e == 120)
{
printf("A=%d B=%d C=%d D=%d E=%d ", a, b, c, d, e);
}
}
}
}
}
}
猜凶手
#include <stdio.h>
int main()
{
char killer = 0;
for(killer = 'A'; killer <= 'D'; killer++)
{
if((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
{
printf("犯人是%c", killer);
}
}
return 0;
}
@TOC
猜名次
题目介绍:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
做题思路
遍历所有种可能
假设所有位置所有情况都试过了,只需要把满足的那个情况打印出来就可以了,让所有人都当过第一名到第五名。
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 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++)
{
。。。。。。
}
}
}
}
}
}
设置判断条件
题目中的这句“每位选手都说对了一半”是做题的关键 说对了一半,也就变相告诉我们每位选手说的话一半为真,一半为假。 我们都知道,1为真,0为假; 所以对单个选手进行判断:(前半句话)+(后半句话)== 1; 对于多个选手进行判断就只需要用&&进行连接即可
if((a == 3) + (b == 2) == 1
&& (b == 2) + (e == 4) == 1
&& (c == 1) + (d == 2) == 1
&& (c == 5) + (d == 3) == 1
&& (e == 4) + (a == 1) == 1
设置限制条件
根据上面的情况,我们可以找出符合条件的配对,但是这样真的就已经完美了吗? 例如:A 第一名 B 第二名 C 第一名 D 第三名 E 第一名 这个配对也是可以满足判断条件的,但是根据常理分析,第一名到第五名的拥有者只能是唯一的。 所以我们可以知道,配对的基础就是: 一个第一名 一个第二名 一个第三名 一个第四名 一个第五名 所有的名次进行相乘的话,要满足:A * B * C * D * E == 120; 条件补充如下
if((a == 3) + (b == 2) == 1
&& (b == 2) + (e == 4) == 1
&& (c == 1) + (d == 2) == 1
&& (c == 5) + (d == 3) == 1
&& (e == 4) + (a == 1) == 1
&& a * b * c * d * e == 120)
将以上所有的要素结合起来之后,就可以得到以下完整代码:
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 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 == 3) + (b == 2) == 1
&& (b == 2) + (e == 4) == 1
&& (c == 1) + (d == 2) == 1
&& (c == 5) + (d == 3) == 1
&& (e == 4) + (a == 1) == 1
&& a * b * c * d * e == 120)
{
printf("A=%d B=%d C=%d D=%d E=%d ", a, b, c, d, e);
}
}
}
}
}
}
return 0;
}
猜凶手
题目介绍:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
做题思路
遍历所有种可能
如果要找出谁是凶手,那么只要让所有人都当一次凶手,然后找出那个满足所有条件的人,那个人就是凶手。
char killer = 0;
for(killer = 'A'; killer <= 'D'; killer++)
{
。。。。。。
}
设置判断条件
根据题目所说的“已知3个人说了真话,1个人说的是假话。” 可以间接的告诉我们:这四个人的话有三个为真,一个为假 又因为1为真,0为假 所有可以得出以下判断
if((killer != 'A')
+ (killer == 'C')
+ (killer == 'D')
+ (killer != 'D') == 3)
{
printf("犯人是%c", killer);
}
结合以上元素后,可以得到以下的完整代码:
#include <stdio.h>
int main()
{
char killer = 0;
for(killer = 'A'; killer <= 'D'; killer++)
{
if((killer != 'A')
+ (killer == 'C')
+ (killer == 'D')
+ (killer != 'D') == 3)
{
printf("犯人是%c", killer);
}
}
return 0;
}
分享到这里就结束了,如果本文哪里有错误,还请大家指出,请在评论区留言; 如果觉得有用的话,还请给个免费的赞,灰常感谢捏!