Python-约瑟夫环

"""
约瑟夫环问题:
    设有编号为1,2,3,......,n的n个人围成的圈,从第1个人开始从1报数,报到m时停止,报m的人退出圈,再从下1个人开始重新从1开始报数,
    报m的退出圈......直到退出x个人为止
编码思路:
    1.将所有人的编号放入所有人集合
    2.确定第1个退出的人,将其放到退出者集合
    3.从所有人集合中删掉退出的人,并找到下一个退出的人在所有人集合中的下标(第1个人的下标 + 指定退出的数 - 前一个退出的人)
      超出剩余总人数后取余,重新开始报数
"""
def joseph(n,m,x):
    """

    :param n: 总人数
    :param m: 指定退出的报数
    :param x: 总共退出人数
    :return: 退出者的顺序集合
    """
    outer = [None] * x  #依次退出者的集合
    resource = [i+1 for i in range(n)]  #所有人的集合
    index = m-1 #指定报数退出者的下标
    for j in range(x):  #循环x次
        outer[j] = resource[index]   #将退出者先存进退出者集合
        del resource[index]         #从所有人集合中删除退出者
        if len(resource) > 0:       #判断是否全部退出
            index = (index + m-1) % len(resource)   #计算下一个退出者的下标:第1个人的下标 + 指定退出的数 - 前一个退出的人
    return outer

print(joseph(10,3,10))
#[3, 6, 9, 2, 7, 1, 8, 5, 10, 4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值