N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。 请按退出顺序输出每个退出人的原序号。
输入格式:
输入只有一行,包括一个整数N(1<=N<=3000)及一个整数p(1<=p<=5000)。
输出格式:
按退出顺序输出每个退出人的原序号,数据间以一个空格分隔,但行尾无空格。
输入样例:
在这里给出一组输入。例如:
7 3
结尾无空行
输出样例:
3 6 2 7 5 1 4
结尾无空行
C语言代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct ListNode{
int data;
struct ListNode *next;
struct ListNode *front;
}L,*pL;
int N,flag;
//创建双向循环链表
void create(pL *head)
{
(*head)=(pL)malloc(sizeof(L));
(*head)->data =1;
pL ptail=*head;
ptail->next =NULL;
ptail->front =NULL;
for(int i=2;i<N+1;i++)
{
pL pnew=(pL)malloc(sizeof(L));
pnew->data = i;
pnew->next =NULL;
pnew->front =ptail;
ptail->next = pnew;
ptail=pnew;
}
ptail->next =*head;
(*head)->front =ptail;
return;
}
void function(pL head)
{
int i=0;
pL p=head;
int a[N+1];
int cnt=0;
while(i<flag && cnt<N)
{
//如果数到了给定的那个数
if(i==flag-1)
{
cnt++;
a[cnt]=p->data ;
p->front->next = p->next ;
p->next->front = p->front ;
i=-1;
}
p=p->next ;
i++;
}
a[cnt]=p->data;
i=1;
while(i<N)
printf("%d ",a[i++]);
printf("%d",a[i]);
return;
}
int main(void)
{
scanf("%d%d",&N,&flag);
pL ln;
create(&ln);
pL p=ln;
function(ln);
return 0;
}