【练习】n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,每次从这个圆圈中删除第m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数
/************************************************************************/ /* 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; }