约瑟夫问题(报数问题)

约瑟夫问题(报数问题)

起因:

    据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决。Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

约瑟夫问题,是一个计算机科学数学中的问题,在计算机编程算法中,类似问题又称为约瑟夫环,又称“丢手绢问题”。及过程就是先决定一个判断数字为k,若第一个人从一开始报数,若报数到k,则第k个人就要出来,从第k+1个人,又重新开始从一开始报数,报的K的人再次出队,若所有人都报过一遍,则从第一个人开始循环,依次类推。直到只剩下一个人为止

解题步骤:

可以将约瑟夫问题看成小朋友循环排队的方法。小朋友们排成一队,每一位小朋友报数结束后,如果报的数不是出队的数(判断数字k),则自动到对尾排队,如果等于出队数,这个小朋友出队。一直循环,直到剩下一个小朋友为止

 

//这是判断数字为3的时候,其他的类似//
item=int(input()) a=[] num1=0 num2=3 for i in range(1,item+1): a.append(i) while len(a)>1: num1+=1 t=a.pop(0) if num1!=3: a.append(t) else: num1=0 print(a[0])

举一反三:

若不确定让用户随意输入判断数

item,m=map(int,input().split(' '))
a=[]
num1=0
num2=3
for i in range(1,item+1):
    a.append(i)
while len(a)>1:
    num1+=1
    t=a.pop(0)
    if num1!=m:
        a.append(t)
    else:
        num1=0
print(a[0])

这里使用while会更加简单一些,比用for-in循环更好写。

后期还会更新这个问题

 

posted @ 2021-12-20 18:49  天空之城—我的理想国  阅读(619)  评论(0编辑  收藏  举报