C语言(经典编程题:报数游戏)

C语言(经典编程题:报数游戏),第1张

C语言(经典编程题:报数游戏)
题目描述

有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。


题目分析 

 这便是整体的题目流程,大家围成一个圈,愉快的报着数,报到3的人直接out,下一个小伙伴再次从一开始报起,直到我们的决赛圈:

在这也是恭喜我们的m+x号同学获得游戏胜利,可他究竟是谁呢?这也正是我们编程所要解决的目标。 

编程解决

 做这道题的思路其实也正是我们用代码来把整个游戏过程表示出来,让电脑来帮我们依次报数、淘汰、找出决胜者。

接下来是函数原型:

int remind(int n){}   //形参n传入参加此次游戏的总人数,用int返回值来返回胜利者编号

为了解决游戏人数由n传入,存储大小未定的问题我们需要用到C语言动态分配的知识,来定义一个动态数组并且给他们依次赋上编号。 

 而且此题中我们会发现一个关键性的变量,那就是各个玩家所报出来的数字,我们用这个数字来淘汰每个报数报到3的玩家,在这里我们将他命名为tag,同时,我们还需要一个变量来记录淘汰玩家的个数,当淘汰个数到达n-1的时候游戏结束,胜利者也就诞生了,于是我将这个变量命名为out。

int* circle = (int*)malloc(n * sizeof(int));   //生成动态数组来对应每位玩家的状态
int tag = 1;        //当前报数号
int out = 0;        //游戏淘汰人数

for (int i = 1; i <= n; i++)   //为每一位游戏成员挂上编号
	circle[i - 1] = i;

同时,我们需要一个循环来不断地进行报数 *** 作,并且完成每位成员依次报数与报到3即淘汰的 *** 作,循环到淘汰玩家到n-1个时退出循环:

int i = 0;              //用于遍历每一位成员
while (out != n - 1)    //循环到淘汰人数达到n-1人
{
	if (circle[i] == -1)   //如果该成员已被淘汰则不参与计数
	{
		if (i == n - 1)
			i = 0;
		else
			i++;
		continue;
	}
	if (tag == 3)          //如果报数为3,将此成员淘汰,将淘汰人数加1,并且将报数号重置
	{
		circle[i] = -1;    //淘汰则将此成员编号赋为-1以示淘汰
		out++;
		tag = 1;
		if (i == n - 1)
			i = 0;
		else
			i++;
		continue;
	}
	tag++;        //正常(人员未被淘汰参与报数且报数不为3)状况代码段
	if (i == n - 1)
		i = 0;
	else
		i++;
}

对玩家数组的 *** 作已经完毕,接下只需确定返回值内容即可,接下来直接展示完整代码。 

 全部代码
#include

int remind(int n)
{
	int* circle = (int*)malloc(n * sizeof(int));
	int tag = 1;
	int out = 0;

	for (int i = 1; i <= n; i++)   //初始化数组
		circle[i - 1] = i;

	int i = 0;             //用于遍历每一位成员
	while (out != n - 1)
	{
        //如果该成员已被淘汰则不参与计数
		if (circle[i] == -1)  
		{
			if (i == n - 1)
				i = 0;
			else
				i++;
			continue;
		}
        //如果报数为3,将此成员淘汰,将淘汰人数加1,并且将报数号重置
		if (tag == 3)     
		{
			circle[i] = -1;
			out++;
			tag = 1;
			if (i == n - 1)
				i = 0;
			else
				i++;
			continue;
		}
         //正常(人员未被淘汰参与报数且报数不为3)状况代码段
		tag++;           
		if (i == n - 1)
			i = 0;
		else
			i++;
	}
    //确定返回值
	i = 0;                
	while (circle[i] == -1)
		i++;

	free(circle);
	return i+1;
}

 (如有问题,欢迎指正)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5155149.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存