约瑟夫环问题

描述: 现在有n个竞争者围坐一圈,争夺一个很有吸引力的工作(年薪100w $)。假设这些人编号1,2,。。。,n。第一次从1开始报数,数到m(m>0)的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列。以此类推,直到所有人出列为止。老板说最后一个出列的人将获得这份工作。
如果你也想竞争这份工作,那么你会坐着哪个位置上?
实现一个函数,当老板告诉你n和m时,返回得到工作的那个人的编号。
运行时间限制: 无限制 
内存限制: 无限制 
输入: 竞争者人数,报数
输出: 最后出列的竞争者的编号。异常则返回 -1。
样例输入: 10,10 

样例输出: 8 

//链表实现

#include "iostream"
using namespace std;

struct ListNode{
	int num;
	ListNode* next;
};
//自定义链表实现
int JosephusProblem(int n,int m)
{	if (n<1||m<1)
	{
		return -1;
	}

	//建立环
	struct ListNode* head =new struct ListNode();
	struct ListNode*  prev;
	head->num =1;
	head->next =NULL;
	struct ListNode* currNode =head;
	for (int i=1;i<n;i++)
	{
		struct ListNode* cur =new struct ListNode();
		cur->num =i+1;
		cur->next =NULL;
	
		currNode->next =cur;
		currNode =currNode->next;
	}

	currNode->next =head;

	currNode =head;
	prev =head;
	while (currNode->next!=currNode)
	{
		for (int i=1;i<m;i++)
		{
			prev =currNode;
			currNode =currNode->next;
		}
		prev->next =currNode->next;
		delete currNode;
		currNode =prev->next;
	}
	int num = currNode->num;
	delete currNode;
	return num;
}
void main()
{
	int n,m;
	cin>>n>>m;
	cout<<"最后的编号为:"<<JosephusProblem(n,m)<<endl;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值