我是靠谱客的博主 超帅花卷,最近开发中收集的这篇文章主要介绍(python)约瑟夫(Josephus)个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
约瑟夫(Josephus)环问题
题目:n个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一
人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。
如果你想成为最后两个幸运儿,请问开始时应该站在什么位置?(3<=n<=50)
输入:开始时的人数n。
输出:第1行是选出顺序,第2行是两名幸运儿的开始位置(按升序排列),位置编号之
间用一个空格分开。
**理解:这个输入的数不管是奇数还是偶数第一轮淘汰的都是2的倍数,但是以后的话,偶数是淘汰位置在2的倍数上的那个数,奇数是把上轮最后一个数放到第一个数后的位置在2的倍数上的那个数。
n=int(input('请输入n(3<n<=50):'))
list1=[]
list2=[]
#运用一个循环,把人添加到list1里面
for i in range(1,n+1):
list1.append(i)
#定义一个函数,用这个函数进行第一轮的筛选,把是号码是2的倍数的人给删除。
def g1():
for i in list1:
if i%2==0:
list1.remove(i)
list2.append(i)
else:pass
#这个函数用来输出最后的答案
def shuchu():
print(list2)
print(list1)
list3=list1
#定义一个函数,进行第二轮筛选,把位置号码是2的倍数的人,给删除。
def erci():
if len(list1)>2:#判断一下这个列表1里面的人数是否符合题意。
list4 = []
#利用for循环把下标不是i2倍数的添加到列表里
for i in range(len(list1)):
if i % 2 != 0:
list4.append(list1[i])
list2.append(list1[i])
else:
pass#站位符号没有任何意思
for i in list4:
list1.remove(i)
erci()
else:
shuchu()
#判断之前输入的n是偶数还是奇数
if n%2==0:
g1()
erci()
else:
#奇数要把位置进行调整
a=list3[-1]
del list3[-1]
list1=[a]+list3
g1()
erci()
最后
以上就是超帅花卷为你收集整理的(python)约瑟夫(Josephus)个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿的全部内容,希望文章能够帮你解决(python)约瑟夫(Josephus)个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复