PTA 浙大版《C语言程序设计(第4版)》题目集 习题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

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

解析

这道题的思路与之前那道猴子选大王的题雷同。首先将out数组的值全部赋值0,然后一个一个位置向后遍历,遇到out[index]==0的情况即该位置上的人还未退出圈子,计数一个;遇到out[index]!=0的情况表示该位置上的人已经退出圈子,跳过该位置再向后寻找一个。每当计数到达m时,让当前下标为index的人退出圈子,out[index]赋值num,num++。当num超过n时代表n个人都已经退出圈子,即out数组所有的元素都已赋值,结束函数。

代码

void CountOff( int n, int m, int out[] )
{
	for(int i=0;i<n;i++) out[i]=0;
	int num=1;
	int index=0;
	while(num<=n)
	{
		int i=0;
		while(i<m)
		{
			if(out[index]==0)
			{
				i++;
				if(i==m) out[index]=num++;
				index=(index+1)%n;
			}
			else
			{
				while(out[index]!=0) index=(index+1)%n;
				i++;
				if(i==m) out[index]=num++;
				index=(index+1)%n;
			}
		}
	}
}

运行结果

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神箭手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值