问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 结果+1即为原问题的解。
分析:假设有10人,报数为3的出列。这里我启用一个环链表来实现,从第一个结点开始,让每一个结点报数,这个结点报数为3,则从链表中移出,最后剩下的就是我们的答案。
代码如下:
class node():
def __init__(self, value, next=None):
self.value = value
self.next = next
def creat1(n):
if n < 0:
return 0
if n == 1:
return node(1)
else:
root = node(1)
tem = root
for i in range(2, n + 1):
tem.next = node(i)
tem = tem.next
tem.next = root
return root
def main(n, k):
if k == 1:
return n
root = creat1(n)
tem = root
while True:
for i in range(k - 2):
tem = tem.next
tem.next = tem.next.next
tem = tem.next
if tem.next == tem:
break
print(tem.value)
if __name__ == '__main__':
main(10, 3)
如果代码有错,欢迎留言指正。