[PTA]实验8-1-8 报数
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]实验8-1-8 报数相关的知识,希望对你有一定的参考价值。
报数游戏是这样的:有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>
#include<stdlib.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++;
}
}
}
以上是关于[PTA]实验8-1-8 报数的主要内容,如果未能解决你的问题,请参考以下文章