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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© UT丶 中级黑马   /  2014-5-5 17:06  /  1462 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

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

2 个回复

倒序浏览

回帖奖励 +1

我的基础测试最后一题就是这个题,到现在我还不知道怎么做。
回复 使用道具 举报
没人回复?我来分享下,代码可读性比较差,谅解。
  1. #include <stdio.h>

  2. int main(int argc, const char * argv[])
  3. {
  4.     // 定义数组表示15人
  5.     int p[15] = {0};
  6.    
  7.     // 全部初始化为1,表示都在圈内
  8.     for (int k = 0; k < 15; k++) {
  9.         p[k] = 1;
  10.     }
  11.    
  12.     // count表示还在圈内的人数,i表示角标,j表示报号
  13.     int count = 15, i = 0, j = 1;
  14.    
  15.     // 人数只剩1个时跳出循环
  16.     while (count != 1) {
  17.         
  18.         // 角标大于等于15时回到0
  19.         if (i >= 15) {
  20.             i = 0;
  21.         }
  22.         
  23.         // 报号4时回到1
  24.         if (j == 4) {
  25.             j = 1;
  26.         }
  27.         
  28.         // 0表示已经不在圈内,换下一个人
  29.         if (p[i] == 0) {
  30.             i++;
  31.             continue;
  32.         }
  33.         
  34.         // 报号为3的退出圈内,人数也-1
  35.         if (j == 3) {
  36.             p[i] = 0;
  37.             count--;
  38.         }
  39.         
  40.         // 换下一个人报号,报号+1
  41.         j++;
  42.         i++;
  43.         
  44.     }
  45.    
  46.     // 找出最后留在圈内的人的角标
  47.     for (int k = 0; k < 15; k++) {
  48.         if (p[k] == 1) {
  49.             printf("k = %d\n", k);
  50.             break;
  51.         }
  52.     }
  53.    
  54.     return 0;
  55. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马