N个人坐成一个圆环(编号为1 - N),从第S个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2,S = 1。2号先出列,然后是1号,最后剩下的是3号。
测试数据有多组,
每组包括3个数N、K、S,表示有N个人,从编号为S的人开始,数到K出列。
测试数据有多组,
每组包括3个数N、K、S,表示有N个人,从编号为S的人开始,数到K出列。
测试数据有多组
每组包括3个数N、K、S,表示有N个人,从第S个人开始,数到K出列。(2 <= N <= 10^3,10^3 < K <= 10^9, 1 <= S <= N)
出列的人的编号
#include<iostream> using namespace std; #define ok 0 #define error -1 class CNode { int data; CNode *next; CNode *before; public: CNode() { next=NULL; before=NULL; } CNode(int n,CNode *p,CNode *q) { data=n; next=p; before=q; } int getdata() { return data; } CNode *getnext() { return next; } CNode *getbefore() { return before; } void setnext(CNode *p) { next=p; } void setbefore(CNode *q) { before=q; } }; class CList { friend class CNode; CNode *head; int nodenumber; public: CList() { head=NULL; nodenumber=0; } ~CList() { delete head; } void createdoubleTailList(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); tail->setnext(s); tail=s; nodenumber++; } s=new CNode(num[i],head->getnext(),tail); tail->setnext(s); head->getnext()->setbefore(s); tail=s; nodenumber++; } CNode *mybegin(int N,int S) { CNode *L=head->getnext(); int i=1; while(i!=S) { L=L->getnext(); i++; } return L; } void Josef(int N,int K,CNode *L)///N个人,数到K出,L是从S开始时的指针 { int n=N;///一会拿来等N的 CNode *p=L; int count=1; while(n>1) { int k=K; if(k%n!=0) k%=n; else k=n; if(count==k) { cout<<p->getdata()<<" "; p->getbefore()->setnext(p->getnext()); p->getnext()->setbefore(p->getbefore()); p=p->getnext(); count=1; n--; } 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.createdoubleTailList(num,N); CNode *s=L.mybegin(N,S); L.Josef(N,K,s); delete []num; } return 0; }
原文:https://www.cnblogs.com/SZU-DS-wys/p/12177930.html