C语言实现小时候经常做的智力测试题

页面导航:首页 > 软件编程 > C 语言 > C语言实现小时候经常做的智力测试题

C语言实现小时候经常做的智力测试题

来源: 作者: 时间:2016-01-25 09:50 【

下面的是两道面试题,小时候经常会看到这种类似的题目,但是用C语言实现,确实没那么容易想到,尤其是对我这种接触C语言仅仅一年的新人。 话不多说, 先上题...........1、5位运动
    下面的是两道面试题,小时候经常会看到这种类似的题目,但是用C语言实现,确实没那么容易想到,尤其是对我这种接触C语言仅仅一年的新人。
     话不多说, 先上题...........
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("杀手是%c\n",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,输出。
Tags:

相关文章

    文章评论

    最 近 更 新
    热 点 排 行
    Js与CSS工具
    代码转换工具
    
    <