#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
int data;
struct node *next;
}lnode;
lnode* created(int N)
{
lnode *p,*head,*tail;
p=(lnode *)malloc(sizeof(lnode));
p->next=NULL;
head=p;//比顺序建立链表多了一步
tail=p;
p->data=1;
for(int i=2;i<=N;i++)
{
p=(lnode *)malloc(sizeof(lnode));
p->data=i;
tail->next=p;
tail=p;
tail->next=NULL;
}
tail->next=head;
return head;
}
void sel(lnode *head,int m,int n)//n只猴子,m为出圈数
{
int num=0;//猴子报数计数
int count=0;//统计出圈猴子数量
lnode *p,*q;
q=head;
while(q->next!=head)
q=q->next;//指向尾节点
while(count<n-1)//
{
p=q->next;
num++;
if(num%m==0)//如果p节点是m
{
q->next=p->next;
cout<<p->data<<" ";
free(p);
count++;
}
else
q=p;
}
cout<<q->data;//p->data此时为什么不可以啊?
//有没有大佬知道 ,q指向p,
}
int main()
{
lnode *head;
int N,P;//N为猴子数
scanf("%d %d",&N,&P);
head=created(N);
sel(head,P,N);
return 0;
}
7-7 约瑟夫环 (25 分)
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