题目描述
N个人坐成一个圆环(编号为1 - N),从第S个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2,S = 1。2号先出列,然后是1号,最后剩下的是3号。
要求使用循环链表实现。
输入
测试数据有多组
每组包括3个数N、K、S,表示有N个人,从第S个人开始,数到K出列。(2 <= N <= 10^6,1 <= K <= 10, 1 <= S <= N)
输出
出列的人的编号
样例输入
13 3 1 3 2 1
样例输出
3 6 9 12 2 7 11 4 10 5 1 8 13 2 1 3
提示
#include<iostream> using namespace std; #define ok 0 #define error -1 class CNode { int data; CNode *next; public: CNode() { next=NULL; } CNode(int n,CNode *p) { data=n; next=p; } int getdata() { return data; } CNode *getnext() { return next; } void setnext(CNode *p) { next=p; } }; class CList { friend class CNode; CNode *head; int nodenumber; public: CList() { head=NULL; nodenumber=0; } ~CList() { delete head; } void nodeplus() { nodenumber++; } void nodeminus() { nodenumber--; } void createTailList(int *num,int n) { CNode *tail; CNode *s; head=new CNode(); tail=head; int i; for(i=0;i<n-1;i++) { s=new CNode(num[i],NULL); tail->setnext(s); tail=s; nodeplus(); } s=new CNode(num[i],head->getnext()); tail->setnext(s); tail=s; nodeplus(); } CNode *mybegin(int N,int S) { if(S<=0) S+=N; CNode *L=head->getnext(); int i=1; while(i!=S) { L=L->getnext(); i++; } return L; } void Josef(int N,int K,int S,CNode *L)///N个人,数到K出,L是从S开始时的指针 { if(K==1) { CNode *p=L; int n=N-1; while(n--) { cout<<p->getdata()<<" "; p=p->getnext(); } cout<<p->getdata()<<" "<<endl; } else { CNode *p=L; int count=1; while(p->getnext()!=p) { if(count==K-1) { cout<<p->getnext()->getdata()<<" "; p->setnext(p->getnext()->getnext()); p=p->getnext(); count=1; } else { count++; p=p->getnext(); } } cout<<p->getdata()<<" "<<endl; } } }; int main() { int N,K,S;///N个人,数到K出列,从S开始 while(cin>>N>>K>>S) { int *num=new int[N]; for(int i=0;i<N;i++) num[i]=i+1; CList L; L.createTailList(num,N); CNode *s=L.mybegin(N,S); L.Josef(N,K,S,s); delete []num; } return 0; }