• 约瑟夫问题


    设编号分别为:1,2,...,n的n个人围坐一圈。约定序号为k(1 <= k < = n)的人从1开始计数,数到m的那个人出列,他的下一位又从1开始计数,数到m的那个人又出列,依次类推,直到所有人出列为止。

    #include <stdio.h>
    #include <stdlib.h>
    //思路:用循环链表实现
    typedef struct node
    {
        int data;
        struct node *next; //不要忘记struct
    }node;
    //第一步:先建立带头结点的环形链表模拟人围成的环,返回第一个结点的指针
    node* create(int n)
    {
        node *p,*head; //p指针为位移标记指针,head指针为头指针
        head = (node*)malloc(sizeof(node));//生成头结点
        p = head; //p指针指向头结点
        node *s;
        int i;
        for(i=1; i<=n; i++)
        {
            s = (node*)malloc(sizeof(node));//生成新结点
            s->data = i; //s结点的data域存放序号
            p->next = s;//p的next域指针指向下一个结点
            p = s; //p指针位移指向下一个结点
        }
    
        s->next = head ->next; //最后一个结点的next域指向第一个结:形成环
        free(head);
        return s->next; //返回第一个结点的指针
    }
    int main()
    {
        int n,m;//一共n个人 数到m的人出局
        scanf("%d %d",&n,&m);
        node *p;
        p = create(n);  //指向第一个结点的指针
    
        //第二步:数到m的人出局
        int i,a;
        node *temp;
        a=n%m;//每次都数3个数即m=3  所以对3取余
        while(p!=p->next)
        {
            for(i=1; i<a; i++)
            {
                p=p->next;//运动指针:指向待删除结点的前一个结点!
            }
            temp=p->next; //temp指针为待删除位置!
            printf("%d->",temp->data);//输出删除的结点data值
            p->next = temp->next;//如果m=3则第二结点next域指向第四个位置
            p = temp->next;//p指向下一个首结点
        }
        printf("%d",p->data);
        return 0;
    }
  • 相关阅读:
    WebBrowser无法显示招商银行password输入控件的问题
    对流式计算模型的理解
    Dev BarManager使用方法
    创业的需求分析——创业杂记【1】
    使用Apktools反编译apk应用
    【JUnit4.10源码分析】3.4 Description与測试树
    基于KWIC 的keyword匹配算法(管道+过滤器模式下实现)
    纯CSS滑动效果
    PhotoSwipe简介
    包加载失败的解决办法
  • 原文地址:https://www.cnblogs.com/qingfengzhuimeng/p/6433062.html
Copyright © 2020-2023  润新知