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<stdlib.h>
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)
c语言游戏编程题经典100例
i++;
free(circle);
return i+1;
}
(如有问题,欢迎指正)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。