Josephu 问题:数组实现和链表实现

本文介绍了约瑟夫环问题,并提供了两种实现方法:一种使用数组实现,另一种使用链表实现。通过这两种方法,可以更好地理解约瑟夫环问题及其解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Josephu 问题为:设编号为1,2,⋯ n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

数组实现

#include <stdio.h>
#include <malloc.h>

int Josephu(int n, int m)
{
	int flag, i, j = 0;
	int *arr = (int *)malloc(n * sizeof(int));
	for (i = 0; i < n; ++i)
		arr[i] = 1;
	for (i = 1; i < n; ++i)
	{
		flag = 0;
		while (flag < m)
		{
			if (j == n)
				j = 0;
			if (arr[j])
				++flag;
			++j;
		}
		arr[j - 1] = 0;
		printf("第%4d个出局的人是:%4d号\n", i, j);
	}
	free(arr);
	return j;
}

int main( )
{
	int n, m;
	scanf("%d%d", &n, &m);
	printf("最后胜利的是%d号!\n", Josephu(n, m));
	//system("pause");
	return 0;
}

链表实现

#include <stdio.h>
#include <malloc.h>

typedef struct Node
{
	int index;
	struct Node *next;
}JosephuNode;

int Josephu(int n, int m)
{
	int i, j;
	JosephuNode *head, *tail;
	head = tail = (JosephuNode *)malloc(sizeof(JosephuNode));
	for (i = 1; i < n; ++i)
	{
		tail->index = i;
		tail->next = (JosephuNode *)malloc(sizeof(JosephuNode));
		tail = tail->next;
	}
	
	tail->index = i;
	tail->next = head;
	for (i = 1; tail != head; ++i)
	{
		for (j = 1; j < m; ++j)
		{
			tail = head;
			head = head->next;
		}
		
		tail->next = head->next;
		printf("第%4d个出局的人是:%4d号\n", i, head->index);
		free(head);
		head = tail->next;
	}
	
	i = head->index;
	free(head);
	return i;
}

int main( )
{
	int n, m;
	scanf("%d%d", &n, &m);
	printf("最后胜利的是%d号!\n", Josephu(n, m));
	//system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值