约瑟夫问题的三种解法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

约瑟夫环问题即设有n个人坐成一个圈,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人再次出列,如此循环,知道所有人都出列为止,最后按照出列顺序输出

约瑟夫环问题的三种方法,

利用数组问题解决:

#include

#include

#pragma warning (disable:4996)

int main(void)

{

printf("请输入总数:\n");

int m;

scanf("%d", &m);

printf("请输入间隔数:\n");

int n;

scanf("%d", &n);

int *a = (int *)malloc(sizeof(int)*m);

int count = 0;

for (int i = 0; i < m; i++)

{

a[i] = i + 1;

}

for (int k = 0; k < m; k++)

{

int l = 0;

while (l < n)

{

l++;

count++;

if (a[(count - 1) % m] == 0)//一旦这个这个数为0,l--,继续寻找

{

l--;

}

}

printf("%d-->", a[(count - 1) % m]);

a[(count - 1) % m] = 0;//每输出一个数,就进行清除,此处为假删除}

}

用循环链表解决,建立一个循环链表,每删除一个数据,节点释放,此处为真删除

#include "stdio.h"

#include "stdlib.h"

#include "malloc.h"

#include "math.h"

#pragma warning (disable:4996)

#define LEN sizeof(struct linklist)

typedef struct linklist

{

int num;

struct linklist *next;

}list;

struct linklist * create_list(int n)// 建立一个存储n个数据的循环链表{

#include "stdio.h"

#include "stdlib.h"

#include "malloc.h"

#include "math.h"

#pragma warning (disable:4996)

#define LEN sizeof(struct linklist)

typedef struct linklist

{

int num;

struct linklist *next;

}list;

struct linklist * create_list(int n)// 建立一个存储n个数据的循环链表{

list *head;

list *p1, *p2; //首先建立循环链表

head = (struct linklist *)malloc(LEN);//头结点的创立

p2 = head;//将p2指针赋初值

p2->next = NULL;

p1 = NULL;

int i;

if (head == NULL)

{

printf("创建链表失败");

return NULL;

}

for (i = 0; i < n; i++) //创立一个n个数据的循环链表

{

p1 = (struct linklist *)malloc(LEN);

p1->num = i + 1;

p2->next = p1;

p2 = p1;

p1->next = NULL;

}

p1->next = head->next;// 将最后一个节点的数据指向第一个节点

return head;

}

void josephus(struct linklist *head, int n, int m) {

list *p1, *p2;

p1 = head->next;

p2 = NULL;

list *temp;

int i, j;

if (head == NULL)

{

printf("传输数据有误");

return;

}

for (i = 0; i < n; i++)

{

for (j = 1; j < m; j++)

{

p2 = p1;

p1 = p1->next;

}

printf("%d---->", p1->num);

temp = p1;

p2->next = temp->next;//删除这个节点

p1 = temp->next;

free(temp);

}

}

void main()

{

int n, m;

list *head;

printf("请输入多少人参与杀人游戏");

scanf("%d", &n);

printf("请输入每几个人死去一个");

scanf("%d", &m);

head = create_list(n);

josephus(head, n, m);

}

相关文档
最新文档