约瑟夫问题的实现 swustoj

约瑟夫问题的实现
 2000(ms)
 65535(kb)
 2662 / 8037
n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。(要求用单循环链表完成。)

输入

第一行为人数n;
第二行为报数k。

输出

输出最后胜利者的标号数。

样例输入

10 
4


样例输出

5
#include
#include
using namespace std;
typedef struct node
{
	int data;
	struct node *next;
}Sqlist;
int main()
{
	int n,m;
	Sqlist *l,*r,*s;
	l=(Sqlist *)malloc(sizeof(Sqlist));
	r=l;
	cin>>n;
	for(int i=1;i<=n;i++)//创建单循环列表
	{
		s=(Sqlist *)malloc(sizeof(Sqlist));
		s->data=i;
		r->next=s;
		r=s;
	}
	r->next=l->next;//让尾端的下一个指针指向头指针的下一个指针
	cin>>m;
	s=l->next;
	while(s->next!=s)
	{
		for(int i=1;i		{
			s=s->next;
		}
		s->next=s->next->next;//跳过要删除的数
		s=s->next;//让s指针指向下一个开始的数
	}
	cout<data;
	return 0;
 } 

你可能感兴趣的:(swustoj)