Python 利用切片解决约瑟夫环(Josephus Ring)问题

Python 利用切片解决约瑟夫环(Josephus Ring)问题

约瑟夫环问题:
将n个人围成一圈,每个人设定为1~n号,设一个数字k,从1号开始报数,报到k的人死亡。然后下一个人重新从1开始报数,以此类推,直至最后剩下1个人存活

算法构思:
根据列表切片的性质,每次将第k个元素从列表中剔除,并以第k个元素为分界线,将原有列表分为前后两部分。
每当剔除一个元素,前面的列表接在后面的列表后,形成一个新列表。然后每次只用剔除列表中的第k个元素即可。

代码实现:

n = int(input('The number of people = '))
k = int(input('The unlucky number = '))
People = list(range(1, n+1))

if n == 1 or k == 1:    
   print('No.%d is survival.' %People[-1])

while True:    
   if k < len(People) and len(People) > 1:        
      print('No.%d had been killed.' %People[k-1])        
      People = People[k:] + People[:k-1]            
   
   elif k == len(People) and len(People) > 1:        
      print('No.%d had been killed.' %People[-1])        
      People = People[:k-1]            
   
   elif k > len(People) and len(People) > 1:        
      sub = k         
      while sub > len(People):            
          sub -= len(People)        
          print('No.%d had been killed.' %People[sub-1])                  
          People = People[sub:] + People[:sub-1]            
    
    else:        
      print('No.%d is survival.' %People[0])        
      break

小日记:
今天是2019年10月29日,是正式开始学习Python的第三天。
CSDN发了第一篇帖子,用得还不是很熟。
花了很长时间解决了约瑟夫环问题,还比较有成就感。但不知道代码有没有漏洞,只是简单验证了几个例子没有问题。
希望每一天都有进步。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值