標籤:sum 曆史 學習 狀態 羅馬 int pre div break
2017年1月16日22:43:21
昨天,學習魚C的鏈表時看到一個約瑟夫問題:
據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下一個重新報數,直到所有人都自殺身亡為止。然而Josephus 和他的朋友並不想遵從。首先從一個人開始,越過k-2個人(因為第一個人已經被越過),並殺掉第k個人。接著,再越過k-1個人,並殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什麼地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。
粗略看了下百科,說是可以用0,1來表示約瑟夫問題中人的生死狀態,花了1個小時,實現了這一方式:
運行環境:python3.3
1 a=[] 2 3 for i in range(41): 4 a.append(1) 5 n = 0 6 m = 0 7 8 while sum(a)!=2: 9 for i in a:10 n = n+i11 m += 112 if n%3==0:13 b = m%41-114 #print(b)15 a[b] = 016 #print(a)17 if sum(a) == 2:18 break19 print(‘for-end‘)20 21 print(a)
結果為:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
兩個1所處位置就是第16與31位。
以迭代的方式用Python解決約瑟夫問題