约瑟夫环问题

约瑟夫环

题目描述
n 个人围成一圈,从第一个人开始报数,数到 mm 的人出列,再由下一个人重新从 11 开始报数,数到 mm 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号

输入形式

输入两个整数 n,m。

输出形式

输出一行 nn 个整数,按顺序输出每个出圈人的编号。

实例
10 3
3 6 9 2 7 1 8 5 10 4
题解

#include<bits/stdc++.h>
typedef struct queuee
{
	int data[101];
	int fron;
	int rear;
}queue;
int main()
{
	/*队列的初始化*/
	queue *q;
	q=(queue *)malloc(sizeof(queuee));
	q->fron=q->rear=0;
	int m,n,a=1;
	scanf("%d%d",&m,&n);
	for(int i=1;i<=m;i++)
	{
		q->data[q->rear]=i;
		q->rear=(q->rear+1)%101;
	}
	while(!(q->rear==q->fron))
	{
		if(a==n)
		{
			printf("%d ",q->data[q->fron]);
			q->fron=(q->fron+1)%101;
			a=1;
		}
		else
		{
			a++;
			q->data[q->rear]=q->data[q->fron];
			q->rear=(q->rear+1)%101;
			q->fron=(q->fron+1)%101;
		}
	}
	return 0;
}

题解

#include<iostream>
using namespace std; 
#include<queue>
queue<int> q;
int main()
{
	int m,n,a=1;//a只是一个计数的东西 
	cin>>m>>n;
	for(int i=1;i<=m;i++)
	q.push(i);
	while(!q.empty())
	{
		if(a==n)
		{
			cout<<q.front()<<" ";
			q.pop();
			a=1;
		}
		else
		{
			a++;
			q.push(q.front());
			q.pop();
		}
	}
	return 0;
}