猴子選大王問題: 一堆猴子都有編號,編號是1,2,3 ...m ,這群猴子(m個)按照1到m的順序圍坐一圈,
從第1開始數,每數到第n個,該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最后一只猴子,則該猴子為大王。
經典算法(C#版本)
1 public int King(int M, int N) 2 { 3 //總猴數 M ,數到第 N 個排除。 4 int k = 0; 5 for (int i = 2; i <= M; i++) 6 k = (k + N) % i; 7 return ++k; 8 }
經典算法(python版本py 2.7)
1 def king(m,n): 2 l,i=range(m),0 #構造list代表猴子,i記錄點名的次數,沒點名時候記0 3 while len(l)>1: #當猴子數目大於一個時候 4 k=l.pop(0) #點到名字的猴子出列 5 i+=1 #點名次數+1 6 if i%n!=0: #不是n*x次被點名的猴子站到隊伍末尾,等待再次被點名 7 l.append(k) 8 return l[0]+1 #返回猴子的編號 list index默認0開始
monkeyking特例時候的(python版本 py 2.7)
1 #5只猴一圈,點到第3個時候出圈 2 l=range(5) 3 while (len(l)>1): 4 l.append(l.pop(0)) 5 l.append(l.pop(0)) 6 l.pop(0) 7 print l[0]+1