约瑟夫环问题(python3.x)

数据结构老师给我们留了约瑟夫环问题,结合我刚刚学完python想巧妙利用python中的列表切片来实现一个环形列表。下面不多BB直接上代码。

 1 n=int(input("输入n:"))        #首先输入两个数m,n
 2 m=int(input("输入m:"))
 3 ls=[]                         #定义一个空列表
 4 for x in range(1,n+1):        #将  为输入 的 n 从1开始加到空列表中
 5     ls.append(x)
 6 length=n                     #先给length  赋值 n
 7 if m!=1:
 8     while length>m:             #当 满足while循环时
 9         for i in range(1,length+1):    
10             if i == m:
11                 a=ls[i:]        #通过两次列表切片巧妙地将复合条件的数字剔除
12                 b=ls[:i-1]      #注意是从 1开始的  不是  0开始的  所以列表索引减一
13                 for j in b:         #将切片得到的两个列表合并  将靠前的切片贴到后面巧妙形成  一个 循环
14                     a.append(j)
15                 length=len(a)    #重新给length赋值   是新的到的列表a
16                 ls=a               #将列表a  赋值给 ls
17                 break
18             continue
19     if length == m:               #如果最后的length = m 则删除索引为m-1的列表元素
20                 del(ls[m-1])
21     length=len(ls)
22       #下面对于m<n的情况
23     while (length < m):   
24         if length != 1:
25             cnt = m%length            #巧妙求余运算使剩下编号形成一个环   
26             if cnt>1:                   #对余数三种情况讨论 
27                 a=ls[cnt:]
28                 b=ls[:cnt-1]
29                 for j in b:
30                     a.append(j)
31                 length = len(a)
32                 ls=a
33             elif cnt==1:
34                 del(ls[cnt-1])
35                 length=len(ls)
36                 continue
37             elif cnt==0:               
38                 del(ls[length-1])
39                 length=len(ls)
40                 continue
41         else:
42             break
43     print(ls[0])
44 else:
45     print(n)

好吧后面注释同上。。。

为了验证代码可靠性,我做了几组实验:

以上就是小白的分享,如果有什么意见欢迎大佬们给我留言~~

原文地址:https://www.cnblogs.com/Pigsss/p/12902506.html