问题描述
已知N个人(以编号1,2,3,…,N分别表示)排成一列。第一轮从编号为1的人开始依次报数,数到2的倍数的人出列;第二轮从头开始依次报数,数到3的倍数的人出列;第三轮再次从头开始依次报数,数到2的倍数的人出列;第四轮从头开始依次报数,数到3的倍数的人出列;依此规律重复下去,直到队列中的人数不超过三个为止。要求输出此时队列中剩下的人在初始队列中的编号。
问题输入
一个正整数N,表示初始人数,N≤5000。
问题输出
输出队列中剩下的人在初始队列中的编号,编号之间有一个空格。
输入样例
20
输出样例
1 7 19
提示
可以使用队列,每次操作时对队列中元素进行判断,不需要舍弃的就重新加入队列。
C语言代码实现
#include<stdio.h>
#include<stdlib.h>
//代表人的结点
typedef struct Node
{
int data;//存放初始编号
struct Node* next;//指向下一个结点的指针
}Node;
//队列
typedef struct Queue
{
Node* front;//队头
Node* rear;//队尾
}Queue;
void InitQueue(Queue*,int);//初始化队列
void EnQueue(Queue*,Node*);//进队
void OutQueue(Queue*);//出队
Node* GetOutQueue(Queue*);//返回出队结点
void RegularOut(Queue*,int,int);//报数出列
int CountQueue(Queue*);//计算队列中的人数
int main()