python中有n个人围成一圈(编号为1~n),从第1号开始进行1、2、3报数,凡报3者就退出,下一个人又从1开始报数……直到最后只剩下一个人时为止。请问此人原来的位置是多少号? 输入格式: 测试数据有多组,处理到文件尾。每组测试输入一个整数n(5≤n≤100)。 输出格式: 对于每组测试,输出最后剩下那个人的编号。
时间: 2024-03-01 13:56:00 浏览: 81
这是一个经典的约瑟夫问题,可以使用循环链表或者递归的方式来求解。我可以为您提供Python代码来解决这个问题。
使用循环链表的方式:
```python
class Node:
def __init__(self, val):
self.val = val
self.next = None
def josephus(n):
# 构建循环链表
head = Node(1)
cur = head
for i in range(2, n+1):
cur.next = Node(i)
cur = cur.next
cur.next = head
# 开始报数
cur = head
while cur.next != cur:
for i in range(1, 3):
cur = cur.next
cur.next = cur.next.next
return cur.val
while True:
try:
n = int(input())
print(josephus(n))
except:
break
```
使用递归的方式:
```python
def josephus(n, k):
if n == 1:
return 1
else:
return (josephus(n-1, k) + k-1) % n + 1
while True:
try:
n = int(input())
print(josephus(n, 3))
except:
break
```
这两种方式都可以得到正确的结果,如果您对其中的实现原理不太理解,可以向我提出疑问。
阅读全文