乙個監獄要槍斃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的倍數,則該士兵出列。這樣重複幾...