约瑟夫环问题

本文详细阐述了如何解决小孩报数问题,通过编程实现特定逻辑,确保每个小孩按顺序出列。实例展示了输入数据格式及输出结果,适用于理解循环、数组操作及条件判断等基本编程概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小孩报数问题

问题描述
  有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。

输入要求
  第一行输入小孩的人数N(N<=64),接下来每行输入一个小孩的名字(人名不超过15个字符) ,最后一行输入W,S (W < N),用逗号”,”间隔
  样例:

5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3

输出要求
  按人名输出小孩按顺序出列的顺序,每行输出一个人名
  样例

Zhangsan
Xiaohua
Xiaoming
Xiaowang
Lisi

源码参考

#include<iostream>
using namespace std;
#define MAX 64
char name[MAX][15];
char data[MAX];
int n;
void show(int current);
int main()
{
    int T,i=0;
    cin>>T;
    while(i++<T)
    {
        cin>>name[i];
        i++;
    }
    int W,S;
    cin>>W;
    getchar();
    cin>>S;
    S--;
    n = T;
    for(i=0;i<T;i++)
        data[i] = i;
    int current = W-1;
    while(n!=1)
    {
        current = (current+S)%n;
        show(data[current]);
        for(int i=current;i<n-1;i++)
            data[i] = data[i+1];
        current = (current+1)%n;
        if(current!=0)
            current--;
        n--;
    }
    show(data[0]);

}
void show(int current)
{
    cout<<name[current]<<endl;
}
可以使用循环队列来模拟这个过程,具体实现如下: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 队列最大长度 // 循环队列结构体 typedef struct { int *data; // 数据数组指针 int front; // 队头指针 int rear; // 队尾指针 int size; // 队列长度 } SqQueue; // 初始化循环队列 void InitQueue(SqQueue *Q, int size) { Q->data = (int *)malloc(sizeof(int) * size); Q->front = Q->rear = 0; Q->size = size; } // 判断循环队列是否为空 int QueueEmpty(SqQueue *Q) { return Q->front == Q->rear; } // 入队操作 int EnQueue(SqQueue *Q, int x) { if ((Q->rear + 1) % Q->size == Q->front) { return 0; // 队列已满 } Q->data[Q->rear] = x; Q->rear = (Q->rear + 1) % Q->size; return 1; } // 出队操作 int DeQueue(SqQueue *Q, int *x) { if (QueueEmpty(Q)) { return 0; // 队列已空 } *x = Q->data[Q->front]; Q->front = (Q->front + 1) % Q->size; return 1; } // 小孩出列的顺序 void ChildSequence(int n, int w, int s) { SqQueue Q; InitQueue(&Q, MAX_SIZE); int i, j; for (i = 1; i <= n; i++) { EnQueue(&Q, i); // 初始化队列 } printf("出列顺序:"); i = w - 1; // i指向第w个小孩 while (!QueueEmpty(&Q)) { for (j = 1; j < s; j++) { DeQueue(&Q, &i); EnQueue(&Q, i); // 将前s-1个小孩依次出队入队 } DeQueue(&Q, &i); // 第s个小孩出队 printf("%d ", i); } } int main() { int n, w, s; printf("请输入小孩总数n,从第w个小孩开始报数,报到第s个小孩出列:"); scanf("%d %d %d", &n, &w, &s); ChildSequence(n, w, s); return 0; } ``` 代码中使用了循环队列来存储小孩的编号,初始化时将所有小孩依次入队,然后按照题目要求模拟小孩出列的过程,直到队列为空为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值