/************************************************************************/
/* n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,
每次从这个圆圈中删除第m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数
字)。
当一个数字删除后,从被删除数字的下一个继续删除第m 个数字。
求出在这个圆圈中剩下的最后一个数字。
约瑟夫环? */
/************************************************************************/
#include <iostream>
using namespace std;
struct LNode
{
int value;
LNode* pNext;
};
void JOSEPHUS(int n,int k,int m)
{
LNode* head=NULL;LNode* r=NULL;
for (int i=0;i<n;i++)
{
if (!head)
{
head=new LNode;
head->pNext=NULL;
head->value=i;
r=head;
}
else
{
LNode* pCurrent=new LNode;
r->pNext=pCurrent;
pCurrent->value=i;
pCurrent->pNext=NULL;
r=pCurrent;
}
}
r->pNext=head;
r=head;
LNode* pDlete=r;
for (int i=0;i<k;i++)
{
r=pDlete;
pDlete=pDlete->pNext;
}
while(pDlete->pNext!=pDlete)
{
for (int i=0;i<m-1;i++)
{
r=pDlete;
pDlete=pDlete->pNext;
}
r->pNext=pDlete->pNext;
//cout<<pDlete->value;
delete pDlete;
pDlete=r->pNext;
}
cout<<pDlete->value;
}
int main()
{
JOSEPHUS(9,2,3);
return 0;
}