Python解决约瑟夫问题!!!!500个小孩围一圈,从第一个小孩开始计数,逢3出圈,最后留在圈内的孩子是第几个

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SQingL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值