报数问题

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

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

Output
按人名输出小孩按顺序出列的顺序,每行输出一个人名

Sample Input
5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3

Sample Output
Zhangsan
Xiaohua
Xiaoming
Xiaowang
Lisi

回答:#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

#define maxn 100

int n, w, s;
char name[maxn][100];
bool out[maxn];

int main()
{
    //freopen("t.txt", "r", stdin);
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%s", name[i]);
    scanf("%d,%d", &w, &s);
    memset(out, 0, sizeof(out));
    int pos = w - 1;
    for (int i = n; i > 0; i--)
    {
        int x = s % (i + 1);
        while (out[pos % n])
            pos++;
        for (int j = 0; j < x; j++)
        {
            while (out[pos % n])
                pos++;
            if (j == x - 1)
                break;
            pos++;
        }
        out[pos % n] = true;
        printf("%s\n", name[pos % n]);
        pos %= n;
    }
    return 0;
}

时间: 2024-10-10 15:21:19

报数问题的相关文章

有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号?

void main() { int a[17] = { 0 };//代表17个人,值为0代表还在,1代表离开 int baoshu = 1;//当前报数的数字,最多49 int total = 17;//当前还剩多少人在 int cur = 0;//17个人的当前人循环到的编号 while (total!=1) { if (cur == 17)//说明已经走到下一圈了,需要保证当前人的编号 { cur = 0; } if (a[cur] == 1)//说明该人已经离开圈子,报数不增加,走向下一人

华为机试题 报数1,2,3 报到3 的出列,最后剩下的是谁

描述:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的那位是原来第几号. 输出:多行,每行对应求的结果思路:就是使用数组简单的模拟报数过程,报到3的标记为true import java.util.Scanner; public class baoshu4282 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n; while (s

300个人围成一个圈,从某个指定的人开始报数(1--3),凡是数到3的人退出圈子

public static void main(String[] args) { /* * 300个人围成一个圈,从某个指定的人开始报数(1--3),凡是数到3的人退出圈子, * 问最后剩下的一个是从指定位置开始计数的第几个人? */ int num[]=new int[300]; int i=0; // 数组的下标计数器 0---299 int count=0; // 退出的人数计数器 0---299 int n=1; // 数数的计数器 1---3 while(count<299){ //

使用循环链表实现约瑟夫环(围圈报数问题)

刚开始学C,碰到经典的围圈报数问题,现先将实现代码附下: #include<stdio.h>#include<stdlib.h> struct LNODE{ //链表定义 int data; struct LNODE *next;};typedef struct LNODE Lnode;typedef struct LNODE *LinkList;struct LNODE *create(int s[]) //创建单项循环链表{ struct LNODE *head=NULL,*p

C语言——N个人围成一圈报数淘汰问题

<一>问题描述: 有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止. 问此人原来的位置是多少号? <二>问题解决: 1.定义数组记录每个编号的状态(是否被淘汰): 2.在未被淘汰的人中检查是否数到3,若是,淘汰此人: 3.继续此过程至所有人被淘汰: <三>示例代码: 1 /* 2 16.有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 3 凡报到 3的倍数的人离

围圈报数 c

#include<stdio.h> /*围圈报数*/ void left(int *p,int m,int n) { int i,j,count; i = j = count = 0; while(count < m-1) { if(*(p+i) != 0) j++; if(j == n) { *(p+i) = 0; count++; j = 0; } if(++i == m) i = 0; } } int main(void) { int x,y; scanf("%d%d&q

湖南省第七届大学生计算机程序设计竞赛 报数游戏

报数游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述     n 个人站成一行玩一个报数游戏.所有人从左到右编号为 1 到 n.游戏开始时,最左边的人报 1,他右边的人报 2,编号为 3 的人报 3,等等.当编号为 n 的人(即最右边的人)报完 n 之后,轮到他左边的人(即编号为n-1 的人)报 n+1,然后编号为 n-2 的人报 n+2,以此类推.当最左边的人再次报数之后,报数方向又变成从左到右,依次类推. 为了防止游戏太无聊,报数时有一个特例:如果应该报的数

报数游戏

B - 报数游戏Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64uSubmit StatusDescriptionn个人站成一行玩一个报数游戏.所有人从左到右编号为1到n.游戏开始时,最左边的人报1,他右边的人报2,编号为3的人报3,等等. 当编号为n的人(即最右边的人)报完n之后,轮到他左边的人(即编号为n-1的人)报n+1,然后编号为n-2的人报n+2,以此类推. 当最左边的人再次报数之后,报数方向又变成从

约瑟夫问题 小孩报数问题poj3750

小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15228   Accepted: 6778 Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序. Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小

华为机试题【11】-报数删除人

题目描述: 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的那位是原来第几号. 思路分析: 首先是选好数据结构,轻量级的boolean数组,下边代表序号,全部初始化位true 退出变为false,设置全局变量int a,遍历数组,a++(当对应为false时候,continue跳过) 遍历数组统计true的数量,为1时候退出 注意: 如果要用List来存储,注意遍历remove删除时候,要一致,不能list和iterator混用 代码: import