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
这个题一看就是建立一个循环链表,然后不断地循环遍历记录,之后再输出。
下面贴上咱们的代码。
这个题其实比较好想,但是中途出了很多bug,导致改bug的时候花的时间占了百分之八十。。。。。
#include<cstdio>
#include<stdlib.h>
struct Node{
int num;
Node *next;
};
//初始化链表,先建立一个循环链表,按照给定N值 ,返回循环链表尾端
Node* init(int a){
//由于最终要把尾结点和头结点链接起来,所以这里建立的是一个头结点。
Node *head=(Node*)malloc(sizeof(struct Node));
//然后这里就是经常用的工作指针了。
Node *p=head;
p->num=1;
//这里不等于二的原因是循环链表头结点和尾结点都比较特殊,给单独拿出来,剩下的就可以循环建立了。
while(a!=2){
Node *temp=(Node*)malloc(sizeof(struct Node));