A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. /*题目:
  2. 耶稣又15个门徒,其中有一个时出卖耶稣的叛徒,请用排除法找出这位门徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3.。。凡是报到“3”的退出圈子,最后留在圈子内的就是叛徒。找出他原来的序号。、

  3. 答案:第5个(后面有优化改进方法)
  4. 分析:
  5. 1、 先说思路,从第一个报数,引入一个计数count,报到3(就是count加到3)的标记位好人,并且让他下次循环不报数。而且count赋值0,继续报数,以此循环。因为报到第十五个人,需要继续从第1个再报数,因此外围还要有个循环,外围第循环用好人数来控制,当好人到15个的时候停止报数,这时最后一个,也就是第十五个好人就是叛徒,因此在标记好人的时候,加上一个pantu的记录,用来记录这个人的序号。最后一次记录的序号就是叛徒。

  6. 2、 一开始定义了个二维数组,想的是一个定义序号,一个定义是否是好人(0,1),后来想了想没必要,序列号直接下标就可以了。
  7. */


  8. #import <stdio.h>

  9. int main()
  10. {
  11.     int people[15] = {0};  // 定义数组15个人,下标+1就代表序号。元素0代表不知道是否是好人。当后面改为1的代表是好人。
  12.    
  13.     int count = 0;         // 用来记报的数,循环时从1开始,数到3就归0.
  14.     int haoren = 0;        // 好人个数,报到3,好人就加一个
  15.     int pantu = 0;         // 叛徒,最后一个好人就是叛徒
  16.    
  17.    
  18.     for (; haoren <= 14;)   // 外循环,直到出现15个好人时停止循环
  19.     {
  20.         for (int i = 0; i <= 14; i++)  // 15个人从头报数
  21.         {
  22.             if (people[i] == 0)     // 如果不确定是好人,就报数
  23.             {
  24.                 count ++;           // 只要有人报数就+1
  25.                
  26.                 if (count == 3)     // 报到3时,进行下面到操作
  27.                 {
  28.                     count = 0;      // 报到计数归0,后面到人继续从1报
  29.                     
  30.                     people[i] = 1;  // 报3的人标记为好人,后面不再参与报数
  31.                     
  32.                     haoren ++;      // 好人数加1
  33.                     
  34.                     pantu = i+1;    // 叛徒暂时标记为最后这个报数的人(一开始没有+1,忘了下标是从0开始的)
  35.                 }
  36.             }
  37.         }
  38.     }
  39.    
  40.     printf("叛徒的序号是%d\n",pantu); // 打印出叛徒的序号,打印结果为5
  41.    
  42.     return 0;
  43. }


  44. /*

  45. 我把代码又改进了一下,双循环改为一个循环。(建议先浏览第十题后再浏览本页代码)
  46. */


  47. #import <stdio.h>

  48. int main()
  49. {
  50.     int people[15] = {0};
  51.     int count = 0;
  52.    
  53.     int haoren = 0;
  54.     int pantu = 0;
  55.    
  56.    
  57.     int i = 0;                          // 这一句要写到外面了。不能每次循环都从0开始。
  58.    
  59.         for (; haoren <= 14;i ++ )      // 从此处改动,循环一直继续,直到出现第十五个好人结束。
  60.         {
  61.             if (people[i] == 0)
  62.             {
  63.                  count ++;
  64.                 if (count == 3)
  65.                 {
  66.                     count = 0;
  67.                     people[i] = 1;
  68.                     haoren ++;
  69.                     pantu = i+1;
  70.                 }
  71.             }
  72.             
  73.             if (i == 14)                 // 报数到第十五个人,返回头再开始报数
  74.             {
  75.                 i = -1;
  76.             }
  77.             
  78.         }

  79.    
  80.     printf("叛徒的序号是%d\n",pantu);
  81.    
  82.     return 0;
  83. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
Micro + 1 赞一个!

查看全部评分

2 个回复

正序浏览

pat是什么?
回复 使用道具 举报
推荐你去pat刷题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马