题目地址:http://ac.jobdu.com/problem.php?id=1188
-
题目描述:
N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。
请按退出顺序输出每个退出人的原序号。
-
输入:
包括一个整数N(1<=N<=3000)及一个整数p。
-
输出:
测试数据可能有多组,对于每一组数据,按退出顺序输出每个退出人的原序号。
-
样例输入:7 3
-
样例输出:3 6 2 7 5 1 4
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct node{ 5 int data; 6 struct node *next; 7 }linklist; 8 9 int main() 10 { 11 linklist *head,*r,*t; 12 int n,p,i; 13 while(scanf("%d %d",&n,&p)==2){ 14 head=r=t=NULL; 15 if(n<1||n>3000) break; 16 for(i=1;i<=n;i++){ 17 t=(linklist *)malloc(sizeof(linklist)); 18 if(i==1) head=t; 19 t->data=i; 20 if(r!=NULL) r->next=t; 21 r=t; 22 } 23 t->next=head; 24 25 while(r->next!=r){ 26 t=r->next; 27 for(i=1;i<p;i++){ 28 r=r->next; 29 t=t->next; 30 } 31 printf("%d ",t->data); 32 r->next=t->next; 33 free(t); 34 } 35 printf("%d\n",r->data); 36 } 37 return 0; 38 }