[PTA]习题8-4 报数

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]习题8-4 报数相关的知识,希望对你有一定的参考价值。

[PTA]习题8-4 报数

报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。

本题要求编写函数,给出每个人的退出顺序编号。

函数接口定义:
void CountOff( int n, int m, int out[] );
其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。函数CountOff将每个人的退出顺序编号存在数组out[]中。因为C语言数组下标是从0开始的,所以第i个位置上的人是第out[i-1]个退出的。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 20

void CountOff( int n, int m, int out[] );

int main()
{
    int out[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    CountOff( n, m, out );   
    for ( i = 0; i < n; i++ )
        printf("%d ", out[i]);
    printf("\\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:
11 3
输出样例:
4 10 1 7 5 2 11 9 3 6 8

  • 提交结果:

在这里插入图片描述

  • 源码:
#include <stdio.h>
#define MAXN 20

void CountOff(int n, int m, int out[]);

int main()
{
    int out[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    CountOff(n, m, out);
    for (i = 0; i < n; i++)
        printf("%d ", out[i]);
    printf("\\n");

    return 0;
}

/* 你的代码将被嵌在这里 */
void CountOff(int n, int m, int out[])
{
    // 使用calloc函数进行动态内存分配
    // malloc()与calloc()函数的区别,前者只分配内存,后者分配的同时初始化所有值为0
    // 故可用0表示某人还在队列中,-1表示已经出队
    int* p = (int*)calloc(sizeof(int), n);

    int i = 0;  // 数组下标
    int count = 0;   // 报数,从1 ~ m

    // 出队n次,记录每个人出队的顺序
    for (int dequeue = 1; dequeue <= n; dequeue++)
    {
        // 一直在队列中查找,直到某人出队
        while (1)
        {
            // 到队尾,再次从队头开始
            if (i == n)
            {
                i = 0;
            }

            // 该人已经不在队列中,继续
            if (p[i] != 0)
            {
                i++;
                continue;
            }

            // 该人在队列中,报数
            count++;

            // 如果该人的报数为m,则该人出队
            if (count == m)
            {
                // 出队
                p[i] = -1;
                // 重新报数
                count = 0;
                // 记录其出队的顺序
                out[i] = dequeue;
                // 下一个报数人的下标
                i++;
                // 已有人出队,查找下一个出队的人,跳出while()循环
                break;
            }

            // 下一个报数人的下标
            i++;
        }     
    }
    
    // 释放内存
    free(p);
}

以上是关于[PTA]习题8-4 报数的主要内容,如果未能解决你的问题,请参考以下文章

习题8-4 报数 (20分)

习题8-4 报数 (20 分)

习题8-4 报数 (20 分)

[PTA]实验8-1-8 报数

PTA习题解析——目录树

[PTA]约瑟夫环(Josephus)问题