黑马程序员技术交流社区

标题: 一道C语言经典题目,会的,请给出解题思路,并附上代码.... [打印本页]

作者: YKS    时间: 2014-7-13 17:51
标题: 一道C语言经典题目,会的,请给出解题思路,并附上代码....
      耶稣有13个门徒,其中一个就是出卖耶稣的叛徒,请用排除法找出这个叛徒:13人围坐一圈,从第一个开始报号:1,2,3,1,2,3......,凡是报道”3“
就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。
     有会的,请给点解题思路,谢谢了。

作者: 温天恩    时间: 2014-7-13 23:14
  1. #import <stdio.h>

  2. // 定义主函数,作为程序入口
  3. int main()
  4. {
  5.     // 代表叛徒的序号
  6.     int left;
  7.    
  8.     // 代表已退出圈子的门徒数
  9.         int out = 0;
  10.    
  11.     // 代表总门徒数目
  12.         int n = 13;
  13.    
  14.     // 代表报数数值
  15.         int flag = 0;
  16.    
  17.     // 用数组a存放所有门徒,并赋值为0,表示全在圈子
  18.         int a[13] = {0};
  19.    
  20.     // 打印提示门徒的出圈顺序
  21.     printf("13个门徒依次退出圈子的顺序是:\n");
  22.    
  23.     // 当还有门徒未出圈时,执行循环
  24.         while(out<n)
  25.         {
  26.         // 设置i值作为for循环参数
  27.         int i;
  28.         
  29.         /***********利用for循环使门徒报数,并把已退出圈子的门徒设置状态值为1**********/
  30.         // 当未到最后一个门徒时,i++,执行循环体
  31.                 for(i=0;i<n;i++)
  32.                 {
  33.             // 如果未出圈,则报数
  34.                         if(a[i] == 0)
  35.                         {
  36.                 // 报数
  37.                                 flag++;
  38.                         }
  39.             
  40.             // 如果报数为3,执行以下语句
  41.                         if(flag == 3)
  42.                         {
  43.                 // 将状态位置为1
  44.                                 a[i] = 1;
  45.                
  46.                 // 已退出圈子的人数加1
  47.                                 out++;
  48.                
  49.                 // 将报数置0,用于下一个门徒报数
  50.                                 flag = 0;
  51.                
  52.                 // 输出现在报数门徒的序号
  53.                                 printf("%d,",i+1);
  54.                
  55.                 // 最后一次循环时,最后一个门徒即为叛徒,将其序号赋值给left,记录叛徒序号
  56.                 left = i+1;
  57.                         }
  58.             
  59.             // 判断本圈报数是否结束
  60.                         if(i == n)
  61.                         {
  62.                 // 如果本圈报数结束,将i置0,进入下一圈报数
  63.                                 i=0;
  64.                         }
  65.                 }
  66.         }
  67.    
  68.     // 输出叛徒序号
  69.     printf("\n叛徒是%d\n",left);
  70.    
  71.     // 返回0,退出主函数
  72.     return 0;
  73. }
复制代码

解题思路
作者: 可心来了    时间: 2014-7-14 00:25
楼上给力啊 好像很厉害的样子
作者: YKS    时间: 2014-7-14 01:40
温天恩 发表于 2014-7-13 23:14
解题思路

有点看不懂 ,浆糊了
作者: YKS    时间: 2014-7-14 19:23
温天恩 发表于 2014-7-13 23:14
解题思路

看到了谢谢 啊 ,好厉害
作者: 温天恩    时间: 2014-7-14 20:09
YKS 发表于 2014-7-14 19:23
看到了谢谢 啊 ,好厉害

不客气,大家共同提高。
作者: 云霄之上    时间: 2014-7-15 01:20
#include(stdio.h)
int  test2(test3[])//返回还没有被变成0的成员编码的数量
{int m;
int o;
for(m=0;m<15;m++)
  {if (test3[m]!=0)
    o++;
    return o;
  }
}
int test(test1[])//返回还没有被变成0的那个成员的编码
{int l;
  int n;
  for(l=0;l<15;l++)
  {if(test1(l)!=0)

    return  test1[l];
  }

}
int main{
  int name[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  int i;
  int j;
  while(test2(name[])!=1)//当编码不为0的数量为1的时候

  {for(i=0;i<15;i++)//循环让编码数数到3时变为0

    {if(name[i]!=0)
      {j++;
      if(j=3)
        {name[i]=0;
        J=0;
        }
      }
printf(“叛徒是%d/n”,test1(name[]));
return 0;
}


初略写了一下
作者: 小海    时间: 2014-7-15 17:25
是不是每个人基础测试题里都会有这道题啊
作者: 此生逍遥    时间: 2014-7-15 22:15
貌似很简单,却有无从下手




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