N个人围成一圈,从第一个人开始报数,数到M的人出圈,再由下一个人开始报数,数到M的人出圈,以此类推,输出依次出圈的人的编号,编写一个c语言程序
时间: 2024-09-19 21:15:09 浏览: 62
这是一个经典的环形队列(Circular Queue)问题,可以用C语言来解决。我们可以使用数组和索引来模拟这个过程。以下是基本的解决方案:
```c
#include <stdio.h>
#define MAX_N 100 // 最大人数限制
#define M 3 // 报数次数
typedef struct {
int people[MAX_N]; // 用于存储人员编号的数组
int front, rear; // 前端和后端指针
} CircleQueue;
void init(CircleQueue *queue) {
queue->front = queue->rear = - 1) % MAX_N == queue->rear) {
return true;
}
return false;
}
bool isEmpty(CircleQueue *queue) {
return queue->front == -1;
}
void enqueue(CircleQueue *queue, int num) {
if (isFull(queue)) {
printf("Queue is full.\n");
return;
}
if (isEmpty(queue)) {
queue->front = queue->rear = 0;
} else {
queue->rear = (queue->rear + 1) % MAX_N;
}
queue->people[queue->rear] = num;
}
void dequeue(CircleQueue *queue) {
if (isEmpty(queue)) {
printf("Queue is empty.\n");
return;
}
queue->front = (queue->front + 1) % MAX_N;
}
void printQueue(CircleQueue *queue) {
for (int i = queue->front; i != queue->rear; i = (i + 1) % MAX_N) {
printf("%d ", queue->people[i]);
}
if (queue->front == queue->rear) {
printf("%d", queue->people[queue->front]);
}
printf("\n");
}
int main() {
CircleQueue queue;
init(&queue);
// 假设有10个人,初始状态下没有人出圈
for (int i = 0; i < 10; i++) {
enqueue(&queue, i+1);
}
while (!isEmpty(&queue)) {
printQueue(&queue);
dequeue(&queue);
}
return 0;
}
```
此程序会按照给定的规则逐次输出出圈的人的编号。
阅读全文