黑马程序员技术交流社区

标题: 耶稣问题 求助大神 ,给点思路 谢谢啦 [打印本页]

作者: wg592930    时间: 2015-5-7 19:53
标题: 耶稣问题 求助大神 ,给点思路 谢谢啦
耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:123123……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(C语言)


作者: 仰望的繁华    时间: 2015-5-7 22:42
http://v.ku6.com/show/TXV_tn2WisSr2H2s4k7jEw...html
送你个视频,我全靠这视频才弄懂的。
虽然不是最优的方法,但确实讲的比较容易理解。
作者: cui0wei0    时间: 2015-5-7 23:31
定义一个数组.
加一个循环, 用剩余人数作控制条件,剩余人数为1的时候就结束.
报数可以用一个计数器,%3==0就把数组中的元素赋予特定的值, 比如0.
最后剩下的一个人不为0, 再找出下标+1就是第几个人.
应该结果是5
作者: wanjiadenghuo    时间: 2015-5-7 23:59
#include<stdio.h>
int main()
{
int people[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int count = 0;//用来记录报数

int number = 15;//记录活着的人数

int i = 0;//记录第几个人正在报数

while (number > 1)
{
   
    if (people[i] != 0)
    {
        
        count++; //如果a[i ]没有被剔除掉,报数有效
        
    }
    if (count == 3)
    {
        
        people[i] = 0;//剔除掉,
        
        count = 0;//报数清零
        
        number--;//存活人数减一
        
    }
   
    i++;//记录报数的下一个人
   
    if (i == 15)
    {
        
        i = 0;// 当超出范围时,立即将报数人数置为第一人
        
    }
   
}
for (int i = 0; i < 15; i++)
{
   
    if (people[i] > 0)
    {
        
        printf("叛徒是第%d人 ", people[i]);
        
    }
   
}
   
}
可以仔细琢磨下 这种把人数存放数组的方法代码和思路都能通俗易懂
作者: 梦初醉    时间: 2015-5-8 00:34
主要还是思想
作者: ydy96315    时间: 2015-5-8 06:02
这个是基础测试还是入学测试题啊
作者: wg592930    时间: 2015-5-8 06:51
仰望的繁华 发表于 2015-5-7 22:42
http://v.ku6.com/show/TXV_tn2WisSr2H2s4k7jEw...html
送你个视频,我全靠这视频才弄懂的。
虽然不是最优 ...

谢谢你啊  非常感谢
作者: wg592930    时间: 2015-5-8 06:52
ydy96315 发表于 2015-5-8 06:02
这个是基础测试还是入学测试题啊

这个是基础测试题, 没有思路
作者: wg592930    时间: 2015-5-8 06:54
wanjiadenghuo 发表于 2015-5-7 23:59
#include
int main()
{

谢谢 大神啊 我再研究研究
作者: cogddo    时间: 2015-5-8 08:54
定义一个数组,,给每个元素都赋值为0,,然后循环遍历这个数组,,知道剩下一个人,,其中,数到3,就给当前数组元素赋值为非0,(比如给1)然后报数归零,剩下的人数减一,,一次类推。
作者: ios专用    时间: 2015-5-8 19:44
感谢,这道题我也不会
作者: Phoenix21    时间: 2015-8-17 14:13
我看了看我也不会,我还是继续学习吧,楼主加你为好友啊
作者: tangbinbin    时间: 2015-8-17 16:45
我也抽到了这一题,做完了,给你看下详细的解题代码分析
作者: tangbinbin    时间: 2015-8-17 16:47
#include <stdio.h>
#define N 15
int main ()
{
int a[15];

for (int i=0;i<15;i++)             //给门徒进行编号

{
    a[i]=i+1;

}


int number = 15;                   //记录当前人数
int count = 0;                     //记录报数
i = 0;
while (number > 1)                 //直到一人时退出循环
{
if (a[i] != 0)                     //没有人被剔除掉,报数有效
{
   count++;
  }
if (count == 3)                   //当有人报数为3时,退出的人计为0,报数清零,存活人数减1
{
   a[i] = 0;
   count = 0;
   number--;
  }
   i++;                             //记录报数的下一个人
if (i == 15)                     //当15人报数完毕,立即将报数人数置为第一人
{
   
    i = 0;
  
  }

}
for ( i = 0; i< 15; i++)

{
  if (a[i] > 0)                    //最后剩下的报数不能置0的人即为叛徒
  
  printf("出卖耶稣的人是第%d个门徒", a[i]);
        
               
}
  
return 0;       

}

作者: wg592930    时间: 2015-8-17 17:23
仰望的繁华 发表于 2015-5-7 22:42
http://v.ku6.com/show/TXV_tn2WisSr2H2s4k7jEw...html
送你个视频,我全靠这视频才弄懂的。
虽然不是最优 ...

谢谢啦  非常感谢您的回复
作者: zhangxiaodonghi    时间: 2015-8-17 17:44
共同学习 感谢各位大神
作者: 红双喜    时间: 2015-8-17 18:41
视频讲的不错啊。
作者: 408205555    时间: 2015-8-17 19:57
长知识了。
作者: 408205555    时间: 2015-8-17 19:58
楼主还遇到什么面试题了?
面试题总体感觉难度怎么样?
不能所有笔试题都和这道题一样难度吧?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2