解题报告-2019.12
题目:6-3【拓展编程题_课后练习3】【P215 习题8-三-4】 报数 (20分)
题目详情:
报数游戏是这样的:有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;
}
/* 你的代码将被嵌在这里 */
一、解题思路
文字思路
①首先能够确定的是,这n个人的编号得用数组来进行保存。且初始化数组的值。
②报数的规律是:从第一个人开始报数,报到m的人退出,然后重新从1开始。所以得设一个计数的值,且在一个人退出后重新归零。
③out[]是用来存储每个人的退出顺序的,退出顺序需要设值累加保存。
④利用循环条件 “直到留下最后一个人”进行循环报数,设一个值给已经退出的数组元素,当值报到那时不继续报数。
流程图
二、解题过程中遇到的问题
1、题意理解错误: 我将out[]这个数组理解为存放这个报数中退出的编号
2、考虑不够周全:①将数组赋值时,从一开始到n ②到报数一圈结束时,应当将i重新归为0
三、部分代码
while ( count < n ) { //结束的条件 只剩一个数值
if ( a[i] != 0 )//等于0的即推出的元素 不为0的才继续参与报数
k++;
if ( k == m ) {
j++;
out[i] = j;//第i个数 是第j个退出的意思
k = 0;
count++;
a[i] = 0;
}
i++;
if ( i == n )//又一圈的报数 开始进行
i = 0;
}
原文地址:https://www.cnblogs.com/moonwinfred/p/12050126.html