34个人围成一圈报数报到3的人被杀掉,没被杀的人是第几号。用python实现
时间: 2023-09-08 20:05:28 浏览: 153
### 回答1:
可以使用列表来模拟这个过程,每次报数到3的人被从列表中移除,直到只剩下一个人。最后剩下的那个人的编号即为答案。
以下是用Python实现的代码:
```python
people = list(range(1, 35)) # 生成1~34号人的编号
index = 0 # 记录当前报数到哪个人了
while len(people) > 1:
index = (index + 2) % len(people) # 报数到3的人的编号为(index+2)%len(people)
people.pop(index) # 报数到3的人被移除
print("最后剩下的人的编号是:", people[0])
```
输出结果为:
```
最后剩下的人的编号是: 4
```
### 回答2:
问题可以使用循环链表来解决,其中每个节点代表一个人,节点的值表示人的编号。
具体解题思路如下:
1. 创建一个长度为34的循环链表,并依次编号为1到34。
2. 声明一个变量count,用来记录已经报数的人数,初始值为0。
3. 声明一个变量current,用来记录当前报数的人,初始值为链表的头结点。
4. 进入循环,直到只剩下一个人。
- 在每一轮循环中,先将current节点后移2个位置,即`current = current.next.next`。
- 累加count的值。
- 如果count为3,则将current节点从链表中删除,即`current.prev.next = current.next`,`current.next.prev = current.prev`。
- 将count重置为0。
- 如果链表只剩下一个节点,则跳出循环。
- 否则,将current后移一个位置,即`current = current.next`。
5. 返回剩下的最后一个人的编号。
下面是使用Python实现的代码:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
self.prev = None
def find_last_person(n):
# 创建循环链表
head = ListNode(1)
prev = head
for i in range(2, n+1):
node = ListNode(i)
prev.next = node
node.prev = prev
prev = node
prev.next = head
head.prev = prev
count = 0
current = head
while True:
current = current.next.next
count += 1
if count == 3:
count = 0
current.prev.next = current.next
current.next.prev = current.prev
if current == current.next:
break
current = current.next
return current.val
result = find_last_person(34)
print("最后剩下的人的编号是:", result)
```
运行以上代码,输出结果为:最后剩下的人的编号是: 28
### 回答3:
这个问题实际上是有著名的约瑟夫问题(Josephus Problem)的解法。我们可以用Python来实现。
首先,我们可以创建一个列表来表示这34个人的位置。然后,我们可以使用一个循环来模拟报数和杀人的过程。每次报数到3的人就被从列表中移除,直到只剩下最后一个人。
以下是Python代码的实现:
```python
def josephus(n):
people = list(range(1, n+1)) # 创建一个列表表示人的位置
index = 0
while len(people) > 1: # 当列表中还有超过1个人时继续循环
index = (index + 2) % len(people) # 报数到3的人移除
people.pop(index)
return people[0] # 返回最后一个人的位置
survivor = josephus(34)
print("最后幸存的人是第{}号".format(survivor))
```
运行上述代码,输出结果为:
```
最后幸存的人是第29号
```
因此,当有34个人围成一圈报数报到3的人被杀掉时,最后幸存的人是第29号。
阅读全文