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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

当时没有做出来的,请教下~~

16 个回复

倒序浏览
  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. }
复制代码
回复 使用道具 举报
下面是一种,还有一种使用约瑟夫函数的方法,但是因为没学过,所以不推荐
#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);
    }
   
}
回复 使用道具 举报
好强大,真心强大,谢谢!!!
回复 使用道具 举报
入学测试吧,我也做了这个
回复 使用道具 举报
///////有点不科学,总是第5个,那样的话不能体现出程序的功能强大,是不是应当换题库哦//////
回复 使用道具 举报
学习了,这个可以用好几种方式都可以实现。
回复 使用道具 举报

强大到读不懂!!!!
回复 使用道具 举报
高手啊   都是高手啊
回复 使用道具 举报
你们这些题库是去哪里找的,最近在学基础班,不知道去那里找练习题做
回复 使用道具 举报
大神!学习了!
回复 使用道具 举报
学习了,基础视频看了不到一半,觉得方法多不一定是好事
回复 使用道具 举报
这个叼,得学习学习
回复 使用道具 举报

我觉得这不可能实现,因为最后剩下的会是两人
回复 使用道具 举报
李旭飞 发表于 2015-6-11 09:27
我觉得这不可能实现,因为最后剩下的会是两人

能不能实现你运行一下就知道了
只有2个人 也会来回数到3
最后剩下的是5号
回复 使用道具 举报
lipeng524824 来自手机 中级黑马 2015-6-13 23:33:37
16#
好厉害
回复 使用道具 举报
围观学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马