N个人,依次报数,数到3的剔除,继续从1开始报数。。。。。。剩下的最后一个人编号是多少

可以用到队列的知识,进行循环计数:i(计数总数)%N(队列长度)。

然后使用循环进行报数,限制条件是4(假设报到3回头)。

接着要挑选出满足条件的,即报到3的人。可以用if语句。

如何标记,可以用赋值为0的人代表报到3的人。

循环时如何区分,每次循环都要判断这个人的值是否为0,为0则跳过(不进行报数赋值)。

还有很重要的一点,如何找出最后一个人,可以用flag的方式,每次将报到3的人赋值为0时,flag++,当flag==N就可以输出此时的i

所以i 与flag应当是同时出现的。

另外,由于采用数组,要区分下标 i-1 与实际编号  i  。

具体实现代码如下:

这里取N为10;

 

结果为:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 假设一开始有n个人,按照题目要求进行报数和退出操作,直到只剩下一个人为止。由于每报数到3就退出一个人,所以第一个退出的人的编号是3。而之后每次退出的人的编号都会向后移动3位,因为每隔3个人就会有一个人退出,所以最后留下来的那个人编号应该是从1开始逆推的,即为: $$f(n) = (f(n-1) + 3) \ \text{mod} \ n $$ 其中,f(n)表示最后留下来的人的编号,mod表示取模运算。由于是递归计算,需要有一个初始值f(1)=0。 例如,当n=6时,计算过程如下: $f(1) = 0$ $f(2) = (f(1) + 3) \ \text{mod} \ 2 = 1$ $f(3) = (f(2) + 3) \ \text{mod} \ 3 = 1$ $f(4) = (f(3) + 3) \ \text{mod} \ 4 = 3$ $f(5) = (f(4) + 3) \ \text{mod} \ 5 = 0$ $f(6) = (f(5) + 3) \ \text{mod} \ 6 = 3$ 因此,当n=6时,最后留下来的人的编号是3。 ### 回答2: 假设有n人围成一圈,顺序排号,我们可以通过模拟这个过程来找到最后留下的人的编号。 首先,我们将所有人的编号保存到一个列表中,设为people_list。接下来,我们创建一个pos变量,表示当前报数的人的位置,初始为0(第一个人)。 然后,我们使用一个循环来模拟报数的过程,直到有n-1人退出圈子为止。在每一轮循环中,我们通过pos变量找到当前报数的人,并进行相应的操作。如果该人的编号是3的倍数,我们从people_list中删除该人,并将n减1;否则,我们将pos加1,表示报数一个人。 当循环结束时,最后留下的人的位置即为0,我们可以通过people_list[0]来获取该人的编号。 以下是根据上述思路编写的Python代码: ```python def find_last_person(n): people_list = list(range(1, n+1)) pos = 0 while len(people_list) > 1: if (pos + 1) % 3 == 0: people_list.pop(pos) n -= 1 else: pos = (pos + 1) % n return people_list[0] n = int(input("请输入总人数:")) last_person = find_last_person(n) print("最后留下的是原来的第{}号的人。".format(last_person)) ``` 通过该代码,我们可以输入总人数n,然后输出最后留下的人的原始编号。 ### 回答3: 这个问题可以用数学归纳法进行推导。 假设当围成一圈的人数为1时,只有一个人,那么这个人自然是最后留下来的,即第1号。 当围成一圈的人数为2时,两个人分别记为1号和2号。按照规则报数,第1号报到3后退出圈子,剩下的只有2号。所以最后留下来的是原来的第2号。 当围成一圈的人数为3时,三个人分别记为1号、2号和3号。按照规则报数,第1号报到3后退出圈子,剩下的顺序为2号和3号。然后从2号开始继续报数,2号报到3后退出圈子,最后剩下3号。所以最后留下来的是原来的第3号。 根据以上推理,可以得出以下结论: 当围成一圈的人数为n时,最后留下来的人的编号可以根据(n-1)人的情况进行推导。我们可以将n个人编号从1到n排列,然后依次剔除报到3的人,直到只剩下1个人。假设最后剩下的人的编号为x,则可以根据(n-1)人的情况递推得到x。具体递推公式为: x = (x' + 2) % n + 1 其中x'为(n-1)个人情况下剩下的人的编号。 所以对于n个人围成一圈的情况,最后留下来的人的编号可以通过递推公式得到。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值