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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ios_fce 中级黑马   /  2014-4-24 22:19  /  1752 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 jiangenhao 于 2014-4-24 22:54 编辑
  1. int people[15];
  2.     int pos, peopleNum = 15, step = 0;//peopleNum记录还剩下的人数
  3.    
  4.     for (int i = 1; i <=15; i++)
  5.     {
  6.         people[i-1] = i;
  7.     }
  8.     pos = 0;
  9.    
  10.     while(peopleNum != 1)
  11.     {
  12.         
  13.         if (people[pos])
  14.         {
  15.             step++;//不是零,就报数
  16.         }
  17.         printf("%d\n",people[pos]);
  18.         if (people[pos] && step == 3)
  19.         {
  20.             people[pos] = 0;//当报数到3的时候,就把这个元素置成0
  21.             peopleNum--;//走一个人,减一次
  22.         }
  23.         
  24.         
  25.         pos++;
  26.         if (pos == 15)
  27.         {
  28.             pos = 0;//为了转圈下去
  29.         }
  30.         if (step == 3)
  31.         {
  32.             step = 0;//为了报数的重新计算
  33.         }
  34.     }
  35.     for (int i = 0; i < 15; i++)
  36.     {
  37.         printf("%d\n",people[i]);
  38.     }
  39.    
复制代码

把人删除比较费劲,所以我们把出局的人标记成0
关键在于数到15后 要重新接到1
数到3要接着数1把这两点想清楚就简单多了
希望能帮到你
回复 使用道具 举报
jiangenhao 发表于 2014-4-24 22:43
把人删除比较费劲,所以我们把出局的人标记成0
关键在于数到15后 要重新接到1
数到3要接着数1把这两点想清 ...

我发之前明明改了 怎么没改过来呢 寝室的网速不好 现在改过了 谢谢提醒
回复 使用道具 举报
本帖最后由 一只小菜鸟 于 2014-4-24 23:44 编辑
  1. //耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。
  2. void betry(int arr[1000],int len){
  3.     int arrOut[15];
  4.     int i=0;
  5.     int j=0;
  6.     int k=15;
  7.     while (len) {
  8.         i++;
  9.         if (i%3 == 0) {
  10.             arrOut[j] = arr[i-1];
  11.             j++;
  12.             len--;
  13.         }
  14.         else {
  15.             arr[k]=arr[i-1];
  16.             k++;
  17.         }
  18.     }
  19.     for (int i=0; i<15 ;i++) {
  20.         printf("%d ",arrOut[i]);
  21.     }
  22. }

  23. int main() {
  24.     int arr[15];
  25.     for (int i=0; i<15; i++) {
  26.         arr[i] = i+1;
  27.     }
  28.     int len = sizeof(arr)/sizeof(int);
  29.     betry(arr,len);
  30.     return 0;
  31. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
我也不会做。
回复 使用道具 举报
这是我的答案,关键代码都做了注释
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        //10、 耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(C语言)
        
        int students[15];
        int i=0,m=0,n=15;
        for (int j=0; j<15; j++) {
            students[j]=j+1;              //每个人的初始编号
        }
        while (n!=1) {                     //剩下最后的一个就是叛徒
            if (students[i]!=0) {        //一直循环,当遇见值被3整出的就将其值a[i]设为0;
                m++;                     //m是留在圈内的人从0开始延续的编号。
                if (m%3==0) {
                    students[i]=0;
                    n--;
                }
            }
            i=(i+1)%15;           //得到初始的序号
        }
        for (i=0; i<15; i++) {
            if (students[i]!=0) {                          //最后数组中不为0的那个就是叛徒
                printf("叛徒原来的序号是:%d\n",i+1);
            }
           
        }
        
        // insert code here...
        //NSLog(@"Hello, World!");
        
    }
    return 0;
}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马