乙個約瑟夫環擴充套件問題的Python求解

2021-09-03 05:12:53 字數 1247 閱讀 9024

乙個監獄要槍斃100個犯人。但是有乙個奇怪的規定,所有犯人排成一排,依次編號為1、2、3。。。第一次槍斃單數,剩下的繼續編號,再槍斃單數。問最後剩下的是幾號?

在敲程式之前先空想一下結果:乙個1到100的列表,第一次去除單數,即雙數--2的倍數存活(2、4、6、8等);第二次再去除剩下部分的單數,即保留的數字為原來2的倍數中的雙數字置,即4、8、12等,為2*2=4的倍數; 第三次再保留4、8、12、16的佔據雙數字置的數字,即4*2=8的倍數,剩下8、16等。。。依次類推,得下面結論:

次數保留的編號

去除的人數

去除的總人數

12的倍數

100/2=50502

4的倍數 

50/2=25753

8的倍數

round(25/2)=13884

16的倍數

12/2=6945

32的倍數

6/2=3976

64的倍數

round(3/2)=2997

。。。故最後剩下的是100以內64的倍數,即64號

現在用程式驗證一下想法:

# delete_list儲存每次去除的編號

# index為mylist的下標

# i為每次的報數

# a記錄上一次delete_list的長度

mylist = range(1, 100+1)

delete_list =

index = 0

i = 0

a = 0

while len(delete_list) != 100:

if index > 99:

index = 0

i = 0

print(delete_list[a:len(delete_list)], '共', len(delete_list[a:len(delete_list)]), '人')

a = len(delete_list)

if mylist[index] not in delete_list:

i = i + 1

if i % 2 != 0:

index = index + 1

print('最後一位是:', delete_list[-1], '號犯人')

執行結果:

約瑟夫環的問題

約瑟夫環問題 假設有n個人 每當數到m的時候 就將第m個人出列 接下來從m 1個人開始從1數去 每當數到m的時候就出列 第一次出列一定是編號為 m n 1 剩下的人開始形成乙個新的約瑟夫環 從編號為m n開始計數 假設 k m n 則新的約瑟夫環為 k k 1 k 2 k 3 n 2 n 1 n 0...

約瑟夫環問題想到的

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。在思考這個題目時,想到了很多,開始時,是考慮使用直接一遍一遍的遍歷,但...

變形的約瑟夫環問題

time limit 1 sec memory limit 128 mb submit 142 solved 68 submit status web board n個站成一列的士兵和乙個整數m,士兵編號是1 n。每次士兵按編號從小到大的順序依次報數,如果報的數不是m的倍數,則該士兵出列。這樣重複幾...