问题描述:
有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号那位。
题目分析:
这道题目是我们在日常生活中也能经常见到的一种报数小游戏。首先我们先分析一下游戏的核心——轮流报数 这个过程的本质是什么呢?我们分析一下游戏的过程。
我们先举一个实例:假如有5个人 分别为ABCDE
第一轮:A报1 B报2 C报3(被淘汰) D报1 E报2
第二轮:A报3(被淘汰)B报1 C(已被淘汰)D报2 E报3(淘汰)
第三轮:A(已被淘汰)B报1 C(已被淘汰)D报2 E(已被淘汰)
第四轮:A(已被淘汰)B报3(被淘汰)仅剩一人游戏结束 D获胜
总结一下就是:游戏开始,所有人依次报数,报到三的都退出。所有剩下的人继续报数。一轮结束后 第一个人接着上一轮继续报数,以此类推,直到只剩下一个人。
那么主要的动作有两个:
不断重复地1~3报数 但要跳过已被淘汰的人 且 一轮结束后 继续接着上一轮的结尾的数字
将报到3的人移出
那么如何用C语言实现这两点呢?
第二个很好解决 我们就用最简单的建立对应长度的数组 用1表示仍在场上 0表示已被淘汰。
第一个过程想要用C语言来实现就要模拟出不断1~3的循环 而且还能够不间断的在不同轮间衔接。
这样乍一看没有任何思路。那么怎么样能将问题简化一下,更加直观的表达出来呢?
1~3循环报数,报到3的淘汰的本质和从1开始报数,报到三的倍数淘汰的本质是一样的:
1 2 3(淘汰)1 2 3(淘汰