约瑟夫环问题
约瑟夫环
【题目描述】
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;
}