1、
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第一,我第三。
B选手说:我第二,E第四。
C选手说:我第一,D第二。
D选手说:C最后,我第三。
E选手说:我第四,A第一。
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
#include<stdio.h>
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 (((b == 1) + (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);
}
}
}
}
}
}
system("pause");
return 0;
}
2、
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
#include<stdio.h>
int main()
{
int kill = 0;
for (kill = 'a'; kill <= 'd'; kill++)
{
if ((kill != 'a') + (kill == 'c') + (kill == 'd') + (kill != 'd') == 3)
{
printf("杀手是%cn",kill);
}
}
system("pause");
return 0;
}
看完之后,才发现并没有自己想的那么复杂。总是重复纠结一些问题,导致没有办法去想整体的方法。下面我就简单总结一下我解决这类实际问题的方法吧。
1、 让C语言解决实际问题,其实它是特别笨的,它不能够去分析逻辑找捷径(或者说我们还不会用它找捷径),所以 while 或 for 循环语句是必要的,它得把所有可能的情况一个一个列出来进行分析,看是否符合它的要求,再把符合要求的情况 printf 出来。
第一题,判断五个人的排名,那么输出结果必然是五个人,每个人的名次可能是1-5,那么就有25种情况,嵌套5个for循环语句可以实现这一功能。
第二题,需要判断谁是killer,很明显,程序只需要输入killer是谁就可以,也就是一个人,而其他的人就必然是无关人。因此,有4个嫌疑人,就需要4次循环,每次假设某一个人为killer,一次循环就可以做到列出谁是killer的所有情况。(由于四个人是abcd,所以定义了int型变量,从'a'到‘d’,字符型在内存里是以整型存储的。)
2、列出所有情况之后就要对所有情况进行判断, if 语句,判断是否满足条件。到了第二个难点,条件怎么写。
第一题,五个人,每个人说的都有一真一假,也就是说,一个人说两句话只有一句是真话,“A选手说:B第一,我第三。”两个条件分别是(b==1)(a==3),中间怎么连接呢?
&&:都为真,结果为1 ||:有一个为真结果就为1 而 !考虑多种可能的话程序又会很复杂。这里用先+再判断是否==1,(b==1)+(a==3)==1,两个条件只有一个为真是结果为真,要求五个人说的话都满足,所以五个语句之间用&&连接。只要用循环语句列出来的情况同时满足五个人说的话(只有一句话是真话),则这种情况符合题意,直接输出,然后再次判断下一种情况。
第二题,四个人说的话只有三个人是真的,计算量相当于只有第一题的五分之一,只要判断四个满足三个条件,第四个不满足就可以,而不用多个用&&再连接。
if ((kill != 'a') + (kill == 'c') + (kill == 'd') + (kill != 'd') == 3)四个人说的四种情况相加,结果等于三时,说明只满足三个条件,第四个不满足,当某一个嫌疑人是killer时 if 语句成立,则该嫌疑人确定为killer,输出。