1.面向过程的解决方案
#面向过程的方式解决小孩和圈的问题
cycle=[i for i in range(1,501)]
step=1
while len(cycle)>1:
dels=[]
for kid in cycle:
if step%3==0:
dels.append(kid)
step += 1
# for kid in dels:
# cycle.remove(kid)
cycle=[i for i in cycle if i not in dels]
print(cycle)
2.面向对象的解决方案
#第一个类 小孩 第二个类 圈
#小孩 属性:编号,左手,右手
#圈:属性,头,尾 行为:加一个小孩进圈,移除一个小孩
class Kid:
def __init__(self, gid):
self.gid = gid
self.left = None
self.right = None
class Cycle:
def __init__(self, count):
self.head = None
self.tail = None
for i in range(count):
self.add(Kid(i + 1))
def add(self, kid):
"""向圈中添加小孩"""
if self.head is None and self.tail is None:
self.head = kid
self.tail = kid
kid.left = kid
kid.right = kid
else:
kid.left = self.tail
kid.right = self.head
self.head.left = kid
self.tail.right = kid
self.tail = kid
def remove(self, kid):
"""从圈中移除小孩"""
if kid is self.head:
self.head = kid.right
if kid is self.tail:
self.tail = kid.left
kid.left.right = kid.right
kid.right.left = kid.left
kid.left = None
kid.right = None
cycle = Cycle(500)
cur = cycle.head
step = 1
while cycle.head is not cycle.head.right:
cur = cur.right
if step % 3 == 0:
cycle.remove(cur.left)
step += 1
print(cycle.head.gid)
3.运行结果
程序运行结果为436