黑马程序员技术交流社区

标题: 求教如何用C找到15个耶稣学徒中的那个叛徒? [打印本页]

作者: tabor    时间: 2015-6-8 16:50
标题: 求教如何用C找到15个耶稣学徒中的那个叛徒?
当时没有做出来的,请教下~~
作者: talent123    时间: 2015-6-8 17:43
  1. /*
  2. 耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:
  3. 15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,
  4. 最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。
  5. */
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. //定义节点
  9. typedef struct _node{
  10.         int num;
  11.         struct _node *next;
  12. }Node;
  13. //定义链表
  14. typedef struct _list{
  15.         Node *head;
  16.         Node *tail;
  17. }List;


  18. int main(){
  19.         List list;
  20.         list.head = list.tail = NULL;
  21.         int i;
  22.         //做15个节点,每个节点的num属性就是门徒的标号,从1到15.
  23.         for (i =0; i < 15; i++){               
  24.                         Node *p = (Node *)malloc(sizeof(Node));
  25.                         p->num = i + 1;
  26.                         p->next = NULL;
  27.                 if (list.tail){       
  28.                         list.tail->next = p;
  29.                         list.tail = p;
  30.                 }else {
  31.                         list.head = list.tail = p;
  32.                 }
  33.                
  34.         }
  35.         //把链表头尾连起来
  36.         list.tail->next = list.head;
  37.         //指针 p,q遍历,q在p前面一个节点
  38.         Node *p = list.head;
  39.         Node *q = NULL;

  40.         //按照数到3就删除节点的顺序,
  41.         for (i = 2; ; i++){
  42.                 // i=2的时候,q在1,p在2
  43.                 q = p;
  44.                 p = p->next;
  45.                 //如果p的下一个就是自己,说明链表里只有1个节点了,结束循环。
  46.                 if (p->next == p){
  47.                         printf("last = %d", p->num);
  48.                         break;
  49.                 }
  50.                 //i被3整除就删除节点,同时输出 删除的节点num
  51.                 if (i % 3 == 0){
  52.                         q->next = p->next;
  53.                        
  54.                         printf("delete%d\n", p->num);
  55.                 }
  56.         }       
  57.         return 0;
  58. }
复制代码

作者: luguo    时间: 2015-6-8 18:03
下面是一种,还有一种使用约瑟夫函数的方法,但是因为没学过,所以不推荐
#include <stdio.h>

int main()
{
    // 创建一个集合,并初始化
    int array[15] = {0};
    int j = 0;
    // 初始15个成员
    int count = 15;
    // 排除成员,直到只剩下一个人
    while (count > 1)
    {
        for (int i = 0; i < 15; i++)
        {
            if (array[i] == 0)
            {
                j++;
                // 如果j == 3 报号重新开始(j = 0) 并且排除一个人(count--)
                if (j == 3)
                {
                    array[i] = 1;
                    j = 0;
                    count--;
                }
            }
        }
    }
    for (int i = 0; i < 15; i++)
    {
        if (array[i] == 0)
            printf("叛徒的编号是%d\n",i+1);
    }
   
}
作者: tabor    时间: 2015-6-9 09:04
好强大,真心强大,谢谢!!!
作者: 天下1083    时间: 2015-6-9 11:02
入学测试吧,我也做了这个
作者: tabor    时间: 2015-6-9 14:57
///////有点不科学,总是第5个,那样的话不能体现出程序的功能强大,是不是应当换题库哦//////
作者: 白0702    时间: 2015-6-9 16:50
学习了,这个可以用好几种方式都可以实现。
作者: holfioo    时间: 2015-6-9 20:11
talent123 发表于 2015-6-8 17:43

强大到读不懂!!!!
作者: aofex    时间: 2015-6-9 20:15
高手啊   都是高手啊
作者: 龙豫天下    时间: 2015-6-9 23:03
你们这些题库是去哪里找的,最近在学基础班,不知道去那里找练习题做
作者: ⒈苆都s.兲憶    时间: 2015-6-9 23:11
大神!学习了!
作者: shitou812    时间: 2015-6-10 12:27
学习了,基础视频看了不到一半,觉得方法多不一定是好事
作者: 李旭飞    时间: 2015-6-11 09:25
这个叼,得学习学习
作者: 李旭飞    时间: 2015-6-11 09:27
talent123 发表于 2015-6-8 17:43

我觉得这不可能实现,因为最后剩下的会是两人
作者: talent123    时间: 2015-6-11 11:47
李旭飞 发表于 2015-6-11 09:27
我觉得这不可能实现,因为最后剩下的会是两人

能不能实现你运行一下就知道了
只有2个人 也会来回数到3
最后剩下的是5号
作者: lipeng524824    时间: 2015-6-13 23:33
好厉害
作者: 马贺飞    时间: 2015-6-15 22:59
围观学习




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