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
答案:
#include <stdio.h>
#include <stdlib.h>
struct node{
int data;
struct node *next;
};
int main(){
struct node *head = NULL,*tail = NULL,*p = NULL,*q = NULL;
int a,b;
int i = 0;
head = (struct node *)malloc(sizeof(struct node));
head->data = -1;
head->next = NULL;
tail = head;
scanf("%d%d",&a,&b);
for(i = 0;i < a;i++){
p = (struct node *)malloc(sizeof(struct node));
p->data = i+1;
tail->next = p;
p->next = head->next;
tail = p;
}
p = head->next;
q = tail;
i = 1;
while(p!=q){
if(i == b){
printf("%d ",p->data);
q->next = p->next;
free(p);
p=q->next;//p被删除后,需要重新定义p,所以让p指向q的next域;
i = 1;
}
else{
q = p;
p = p->next;
i++;
}
}
printf("%d",p->data);
free(head);
return 0;
}