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