下面的代码是运用列表来解决约瑟夫问题。
在下面的这个代码中你可以输入两个数,例如100与2,那么他就会使得元素总数从1循环到100,将“报数”为2的元素删除来作为条件,解决约瑟夫问题。
从给出的数字里面,我们其实是可以看到约瑟夫问题的一些规律,下面给出一段结果(以127和2为参数)
1
1 3
1 3 5 7
1 3 5 7 9 11 13 15
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127
以上是完整的几组结果,当输入为128和2是则输出又重新变为了1(是新的一组的开始)
我们可以从中看到一些规律
这几组数列都是以1开头的奇数列(2为公差)
1=0*2+1
3=1*2+1
7=3*2+1
15=7*2+1
31=15*2+1
63=31*2+1
127=63*2+1
...
由此我们便找到了当删除元素的报数为2时,最后的剩余元素的规律。
同理,利用此程序我们也可以很方便地找到当删除元素报数为其他的数时得到的剩余元素的规律。
事实上,这个规律(当删除元素的报数为2)较为简单易发现,其他的似乎有点不容易总结,我也没有细看,所以有明白的,懂的,能总结的欢迎评论留言。
"""约瑟夫问题"""
m=int(input("To observe a situation containing several elements:"))
which_num=int(input("Enter the number of the element to be eliminated:"))
elements=[]
for all_num in range(1,m+1):
for i in range(all_num):
elements.append(i+1)
n=0
print(elements)
while len(elements)>1:
for i in range(which_num-1):
n+=1
if n==len(elements):
n=0
del elements[n]
if n==len(elements):
n=0
print(elements[0])
elements=[]