-
题目描述:
-
N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。
请按退出顺序输出每个退出人的原序号。
-
输入:
-
包括一个整数N(1<=N<=3000)及一个整数p。
-
输出:
-
测试数据可能有多组,对于每一组数据,
按退出顺序输出每个退出人的原序号。
-
样例输入:
-
7 3
-
样例输出:
-
3 6 2 7 5 1 4
#include<iostream> #include<assert.h> using namespace std; //#define T list //typedef struct T *T; typedef struct list { int ele; list *next; }; void *creat(int n) { list *t=NULL; list *te; if(t==NULL) { te=new list; te->ele=1; t=te; } list *p=t; for(int i=2;i<=n;i++) { te=new list; te->ele=i; t->next=te; t=te; } t->next=p; return p; } void print(list **p,int q,int n) { int i=1; for(list **head=p;n;) { list *c=*head; while(i<q) { head=&c->next; i++; c=*head; } *head=c->next; i=1; cout<<c->ele; if(n!=1) cout<<" "; else cout<<"\n"; n--; delete c; } } int main() { int n,p; while(cin>>n>>p) { list *y=(list *)creat(n); print(&y,p,n); } }