```python
a = input('请输入人数:')
ring = list(range(1,int(a)+1))
k = []
s = 1
while set(k) != set(range(1,int(a)+1)):
if s > int(a) - 1:
s -= int(a)
k.append(ring[s])
s += 2
print(k)
```
每次输入都会运行很久,是哪里出问题了?
题主的代码逻辑是错误的,约瑟夫环的元素数量始终没有变化,只要输入一个偶数,就会陷入死循环无法结束,而对于奇数,答案也不正确。另外,抛开逻辑错误,代码也有一些可以改进的地方。顺着题主的思路,我写了一段代码,供参考。
>>> def joseph(n):
ring = list(range(1, n+1))
result, s = list(), 0
while len(ring) > 0:
s = (s+1)%len(ring)
result.append(ring.pop(s))
return result
>>> n = int(input('请输入人数:'))
请输入人数:5
>>> joseph(n)
[2, 4, 1, 5, 3]
>>> n = int(input('请输入人数:'))
请输入人数:6
>>> joseph(n)
[2, 4, 6, 3, 1, 5]
>>> n = int(input('请输入人数:'))
请输入人数:20
>>> joseph(n)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 3, 7, 11, 15, 19, 5, 13, 1, 17, 9]
a = input('请输入一个数:')
ring = list(range(1,int(a)+1))
s = 1
k = []
while True:
if s >= len(ring):
s -= len(ring)
for each in ring:
if each in k:
ring.remove(each)
if len(ring) == 1:
break
k.append(ring[s])
s += 2
print(k+ring)
您好,我是问答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632