编程要求 根据提示,在右侧编辑器补充代码,补充完成代码,完成循环队列有关操作和循环报数,其中n为圈中人的个数,m为报数的值。
测试说明 平台会对你编写的代码进行测试:
输入格式 输入只有一行,为n和m。1≤n≤3000,1≤m≤n。
输出格式 输出包含一行,为退出到圈外的人的编号,编号之间以一个空格分隔。
样例输入1 10 3
样例输出1 3 6 9 2 7 1 8 5 10 4
样例输入2 7 4
样例输出1 4 1 6 5 7 3 2
#include <stdio.h>
#include <stdlib.h>
const int MAXSIZE = 3010; //循环队列最大容量
typedef int ElemType; //循环队列元素类型
ElemType Q[MAXSIZE]; //数组模拟循环队列
int front, rear; //队首、队尾指针
//初始化循环队列
void InitQueue()
{
front = rear = 0;
}
//判循环队列是否为空,空返回true;非空返回false
bool EmptyQueue()
{
return front == rear;
}
//判循环队列是否满,满返回true,不满返回false
bool FullQueue()
{
return (rear + 1) % MAXSIZE == front;
}
//入队列操作:先把队尾指针加1,然后把元素放入队尾指针指示的位置
void EnQueue(ElemType e)
{
//请在下面编写代码
/****************Begin**************/
if (!FullQueue())
{
rear = (rear + 1) % MAXSIZE;
Q[rear] = e;
}
/****************End****************/
}
//出队列操作:把队首指针加1
void DeQueue()
{
//请在下面编写代码
/****************Begin**************/
if (!EmptyQueue())
{
front = (front + 1) % MAXSIZE;
}
/****************End****************/
}
//取队首元素
ElemType GetQueue()
{
//请在下面编写代码
/****************Begin**************/
if (!EmptyQueue())
{
return Q[(front + 1) % MAXSIZE];
}
return -1; // 返回一个特殊值表示队列为空
/****************End****************/
}
//求解约瑟夫环问题
void josephus(int n, int m)
{
//请在下面编写代码
/****************Begin**************/
InitQueue();
for (int i = 1; i <= n; ++i)
{
EnQueue(i);
}
int count = 0;
while (!EmptyQueue())
{
ElemType person = GetQueue();
DeQueue();
++count;
if (count % m == 0)
{
printf("%d ", person);
}
else
{
EnQueue(person);
}
}
printf("\n");
/****************End****************/
}
int main(int argc, char* argv[])
{
int n, m;
scanf("%d %d", &n, &m);
josephus(n, m);
return 0;
}