用C++实现约瑟夫环的问题

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。

  假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。

 

//----数学中有乘法口诀。。那只是工具。我们都很熟悉。

//----C++中有一些基本的程序。也只是工具我们必须像熟悉乘法口诀一样去熟悉这些程序。

//----很基础的一些东西必须熟练。。。

#include<iostream>
class link;
using namespace std;
class node{
	friend class link;
public:
	node():next(NULL){}
	node(int value):data(value),next(NULL){}
private:
	int data;
	node *next;
};
class link{
public:
	link(int x,int y,int z):n(x),s(y),m(z){}
	node *createlink()
	{
		node *p,*r;
		node *q;
		r=p=new node;
		for(int i=1;i<=n;++i)
		{
			q=new node;
			q->data=i;
			r->next=q;
			r=q;
		}
		r->next=p->next;
		return p;
	}
	node *jusefu(node *startnode)
	{
		node *p=startnode->next;
		node *q;
			for(int i=1;i<s;++i)
			   
				p=p->next;//让p指向开始数数的位置,让q指向需要删除结点的位置的前一个位置
			q=p->next;
			
			while(q->next!=p)
			{
				q=q->next;
			}
			while(p->next!=p)
			{
				for(int j=1;j<m;++j)
				{
					//node *tmp;
					q=p;
					p=p->next;
					
				}
				q->next=p->next;
				cout<<"将要删除的号码是"<<p->data<<endl;
				delete p;
				p=q->next;

			}
			cout<<"留下来的人数的号码为"<<p->data<<endl;
			return p;
		
	}
private:
	int n;
	int s;
	int m;

};
int main()
{   int i,j,k;
	cout<<"输入总数,开始位置;每次循环人数"<<endl;
	cin>>i>>j>>k;
	link linklist(i,j,k);
	node *head=linklist.createlink();
	node *lastnode=linklist.jusefu(head);


	system("pause");
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值