约瑟夫问题c++

问题描述:一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(n个)按照1-m的顺序围坐一圈,从第1开始数,每数到第m个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

解决1:使用数组存放

#define  Maxsize 1000
void jose(int n,int m)
{
	int mon[Maxsize];
	int i,d,count;
	for (i=0;i<n;i++)
		mon[i]=i+1;
	cout<<"Befoue out:"<<endl;
	for (i=0;i<n;i++)
		cout<<mon[i]<<",";
	cout<<endl;
	cout<<"After out:"<<endl;
	count=0;
	i=-1;
	//函数的实现
	while(count<n)
	{
		d=0;
		while(d<m)
		{
			i=(i+1)%n;
			if (mon[i]!=0)
				d++;
		}
		cout<<mon[i]<<",";
		mon[i]=0;
		count++;
	}
	cout<<endl;
}



解法二,使用循环链表

typedef struct LNode
{
	int data;
	struct LNode *link;
}LNode,*LinkList;
void jose(int n,int m)
{
	LinkList p,pcur;
	p=(LinkList)malloc(sizeof(LNode));
	//第一只猴子单独拉出来了
	p->data=1;
	//循环单链表
	p->link=p;
	pcur=p;
	for (int i=1;i<n;i++)
	{
		LinkList tmp=(LinkList)malloc(sizeof(LNode));
		tmp->data=i+1;
		tmp->link=pcur->link;
		pcur->link=tmp;
		pcur=tmp;
	}
	while(n--)
	{
		LinkList tmp;
		for (int s=m-1;s--;tmp=p,p=p->link);
		tmp->link=p->link;
		cout<<p->data<<"->";
		free(p);
		p=tmp->link;
	}
	cout<<endl;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值