题目描述:有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。 ####相关知识(略) ####编程要求 请仔细阅读右侧代码,结合相关知识,在begin-end区域内进行代码补充。
时间: 2023-05-31 19:19:09 浏览: 93
### 回答1:
题目描述:有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
相关知识(略)
编程要求 请仔细阅读右侧代 码,结合相关知识, 在begin-end区域内进行代码补充。
### 回答2:
这道题是经典的约瑟夫环问题,其算法可以用数学归纳法证明。我们可以先从小样本出发尝试找规律,然后再推广到一般情况。
当 n = 1 时,这个人将会留下来。编号为 1。
当 n = 2 时,第一轮中编号为 2 的人将会被淘汰,留下编号为 1 的人。
当 n = 3 时,第一轮中编号为 3 的人将会被淘汰,下一轮中编号为 1 的人将会报数,留下编号为 2 的人。
当 n = 4 时, 第一轮中编号为 3 的人将会被淘汰,接下来轮到编号为 1 的人报数,然后编号为 2 的人报数,最后编号为 4 的人报数,因为从 1 开始报数,所以他就相当于“绕了一圈”再开始报数,最终留下了编号为 1 的人。
当 n = 5 时,第一轮中编号为 3 的人将会被淘汰,接下来轮到编号为 1 的人报数,然后编号为 2 的人报数,接下来编号为 4 的人报数,最后编号为 5 的人报数,最终留下了编号为 4 的人。
当 n = 6 时,第一轮中编号为 3 的人将会被淘汰,接下来轮到编号为 1 的人报数,然后编号为 2 的人报数,接下来编号为 4 的人报数,然后编号为 5 的人报数,最后编号为 6 的人报数,最终留下了编号为 5 的人。
通过以上规律我们可以看出,当 n >= 2 时,每次淘汰的数的位置都是 3 的倍数(第一次淘汰的位置是 3 的倍数,第二次淘汰的位置是已经删掉了两个人之后的第三个人,也就是 3 的倍数加上 2,以此类推)。最后留下的人的编号就可以根据这个规律依次倒推出来。
举个例子,当 n = 100 时,我们依次淘汰的位置分别是 3, 6, 9, ..., 99,也就是 3k (k = 1,2,3,...,33)。假设最后留下的人的编号是 x,那么他报数的位置就是 1,也就是说在淘汰之前最后一个留下来的人的编号是 (x + 2) % 100,而在淘汰之前倒数第二个留下来的人的编号就是 ((x + 2) % 100 + 2) % 99,以此类推。最后淘汰之前第一个留下来的人的编号就是我们需要求的答案。
根据上述推导,我们可以设计如下的算法实现这个问题:
1. 首先构造一个长度为 n 的数组,把每个人的编号存进去,并将一个指针指向数组的起始位置。
2. 定义一个变量 count,初始化为 1。
3. 从数组起始位置开始,依次遍历数组,每遍历一个人的编号,就让 count 自增 1。当 count 变为 3 时,将该人的编号从数组中删除,并将 count 重置为 1。
4. 重复上述步骤,直到数组中只剩下一个元素为止。最后返回数组中最后一个元素的编号即可。
### 回答3:
这是一道经典的约瑟夫问题,其具体解法如下:
首先,我们可以模拟这个过程来找出每一轮报数的淘汰者。假设现在有10个人,先从第一个人开始报数,若报到3,则该人淘汰。如此往复,直到只剩下最后一人。
第一轮淘汰:原来1、4、7、10四人进行了报数,其中1报数为1,2报数为2,3报数为3,淘汰1;4报数为1,5报数为2,6报数为3,淘汰6;7报数为1,8报数为2,9报数为3,淘汰9;10报数为1,2报数为2,淘汰2。淘汰后序列为:4、7、10、3、8、5
第二轮淘汰:4报数为1,5报数为2,淘汰5;7报数为1,8报数为2,淘汰8;10报数为1,3报数为2,淘汰3;4报数为1,7报数为2,淘汰7;10报数为1,淘汰10。淘汰后序列为 4、9、6、1
第三轮淘汰:4报数为1,9报数为2,淘汰9;6报数为1,1报数为2,淘汰1;4报数为1,6报数为2,淘汰6;剩下的人为4,因此第4个人为最后留下的那位。
因此,当有n个人围成一圈时,最后留下的那位是第f(n)个人,其中f(n)是一个递推式。
设n个人的序列为1、2、......、n,第一次报数后剩下来的序列可以表示为2、3、4、......、n、1。如果我们能找到n-1个人的序列对应的位置p,则n个人的序列对应的位置应该为(p+2) mod n。下面列出递推式 f(n):
f(1) = 1,只有一个人时,最后留下的那位必定为第1位。
f(n) = (f(n-1) + k) mod n,其中k=3,表示每次报数到3时淘汰掉对应的人。
综上所述,当n人围成一圈时,最后留下的那位是原来的第f(n)号那位。