问题描述:
约瑟夫环:设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,求最后一个出圈的编号
1.循环链表
struct Node
{
int data;
Node* next;
Node(int x):data(x),next(NULL){}
};
int getLast(int n,int k)
{
Node* pre=NULL;
Node* head=NULL;
for(int i=1;i<=n;i++)
{
if(i==1)
{
head=new Node(i);
pre=head;
continue;
}
Node* p=new Node(i);
pre->next=p;
pre=p;
}
pre->next=head;
int m=1;
Node* tmp=head;
while(tmp->next!=tmp)
{
if(m%k==0)
{
pre->next=tmp->next;
delete tmp;
tmp=pre->next;
}
else
{
pre=tmp;
tmp=tmp->next;
}
m++;
}
return tmp->data;
}
- 数学解法
这部分还是不太理解,先记录一下
int getLast2(int n,int m)
{
int p=0;
for(int i=2;i<=n;i++)
{
p=(p+m)%i;
}
return p+1;
}
参考博客:https://blog.csdn.net/u011500062/article/details/72855826