用数组模拟求解约瑟夫环问题 ← Python

【问题描述】
约瑟夫环问题:n个人围成一圈,从第一个人开始报数,数到m的人出圈;再由下一个人开始报数,数到m的人出圈;…输出依次出圈的人的编号。n,m由键盘输入。

【算法代码一:输出出圈序列】

n,m=map(int,input().split())
ls=[]
for i in range(1,n+1):
    ls.append(i)

cnt=0
while len(ls)>1:
    t=len(ls)
    while t<m:
        m=m-t

    x=ls.pop(m-1)
    ls=ls+ls[0:m-1]
    for i in range(0,m-1):
        ls.remove(ls[0])
    cnt+=1
    print(x,end=" ")

print(ls[0])


'''
in:
10 3

out:
3 6 9 2 7 1 8 5 10 4
'''


【程序代码二:输出最后出圈的人】

n,m=map(int,input().split())
ls=[]
for i in range(1,n+1):
    ls.append(i)

cnt=0
while len(ls)>1:
    cnt+=1
    if cnt==m:
        cnt=0
        ls.remove(ls[0])
    else:
        ls.append(ls[0])
        ls.remove(ls[0])

print(ls[0])


'''
in:
10 3

out:
4
'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值