美文网首页
约瑟夫环问题

约瑟夫环问题

作者: LH大牛 | 来源:发表于2020-08-10 09:36 被阅读0次

题目:
一圈人围坐,以数字K位第一个个人,叫道 M 的人自动出列,请写出出列顺序

第一种方法:使用单项循环链表实现

//这里是头文件
#ifndef _SQLIST_H__
#define _SQLIST_H__
#define datatype int
typedef struct  sqlist{
  datatype data;//数据域
  struct sqlist *next;//指针域
}sqlist,*linklist;
extern  linklist sqlist_creat ();//创建一个单项循环链表的结点
extern int sqlist_insert(linklist L,int val);//实现循环链表的插入
extern void sqlist_show(linklist L);//显示链表
extern int jhon_show(linklist L,int k,int m);//约瑟夫环算法
#endif
//链表的存储与运算
#include <stdio.h>
#include "./sqlist.h"

#include <stdlib.h>
#include "./02.h"
linklist sqlist_creat()//创建一个空链表
{
    linklist L;
    L= (linklist)malloc(sizeof(sqlist));
    if(L == NULL)
    {
        perror("malloc");
        return NULL;
    }
    else
    {
        L->next=L;
        return L;
    }
}
int sqlist_insert(linklist L,int val)
{
    int i;
    if(L==NULL||val<0)
    {
        puts("argv invaid");
        return -1;
    }
    L->data=1;
    linklist p,r;
    p=r=L;
    for(i=2;i<=val;i++)
    {
        r=sqlist_creat();
        r->data=i;
        p->next=r;
        p=r;
    }
    r->next=L;
}
void sqlist_show(linklist L)
{
    linklist p;
    p=L;
    while(p->next!=L)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("%d\n",p->data);
}

int jhon_show(linklist L,int k,int m) //约瑟夫环算法
{
    int count=1;
    if(L == NULL||k<0 || m<0)
    {
        puts("argv invalid");
        return -1;
    }
    linklist p,r;
    p=L;
    while(p->next->data!=k)
    {
        p=p->next;
    }//找到开始的结点
    printf("开始=%d\n",p->next->data);
    while(p->next != p)
    {
        for(count=0;count<m-1;count++)
        {
            p=p->next;
        }
        r=p->next;
        p->next=r->next;
        printf("%d ",r->data);
        free(r);
        r=NULL;
    }
    printf("%d\n",p->data);
    return 1;
}
//测试样例
#include<stdio.h>
#include "./sqlist.h"
int main(int argc, const char *argv[])
{
    int reval,start,count;
    linklist L=sqlist_creat();
    printf("please input maxsize >");
    fflush(stdout);
    scanf("%d",&reval);
    sqlist_insert(L,reval);
//  sqlist_show( L );
    printf("please input start >");
    fflush(stdout);
    scanf("%d",&start);
    printf("please input count >");
    fflush(stdout);
    scanf("%d",&count);
    reval=jhon_show(L,start,count);
    return 0;
}

程序运行结果


运行结果

第二种方法

相关文章

  • 约瑟夫环问题

    约瑟夫环问题约瑟夫环描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围...

  • 约瑟夫环问题

    0~n-1个数排成环,每次从中删除第m个数字后,问最后剩下的数字是多少 思路:使用链表模拟环状结构,到达尾部时使其...

  • 约瑟夫环问题

    思路 递推,f(n)与f(n-1)的关系,已经f(1)已知,O(n)的复杂度求出结果。f(n) = (f(n-1)...

  • 约瑟夫环问题

    约瑟夫环:30个人(15个教徒和15个非教徒)坐船出海 船坏 需要把15个人扔到海里 其他人才能幸存 围成一圈从某...

  • 约瑟夫环问题

    参考文章 约瑟夫环之二(用递归的思想解决Josephus问题) 解释 解法 初始情况: 0, 1, 2 ........

  • 约瑟夫环问题

    问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编...

  • 约瑟夫环问题

    题目:一圈人围坐,以数字K位第一个个人,叫道 M 的人自动出列,请写出出列顺序 第一种方法:使用单项循环链表实现 ...

  • 约瑟夫环问题

    在刷leetCode 的时候碰到了以下问题:给定一个从1 到 n 排序的整数列表。首先,从左到右,从第一个数字开始...

  • 约瑟夫环问题

  • 约瑟夫环问题

    问题描述 历史典故: 据说著名犹太历史学家 Josephus有过以下的故事: 在罗马人占领乔塔帕特后,39 个犹太...

网友评论

      本文标题:约瑟夫环问题

      本文链接:https://www.haomeiwen.com/subject/ppburktx.html