如果對n-1個人,最後出列人的編號為k=f (n-1);則對n個人,第乙個報m數的人出列後,重排列
.當m % n = 0時,為1, ..., n-1
–則 f(n) = k
.否則,為m%n+1, ..., n, 1, m%n-1
–如果 k ≤ n-m%n則,f(n) = m%n+k
–如果 k > n-m%n則,f(n) = k - n + m%n
.t(n)=t(n-1)+ θ(1) = θ(n)
歸納假設:假設知道n個人,最後乙個的出佇列的人,不妨為f(n)
證明:基礎條件,對於n=1 的時候,報數到m的肯定為自身
假設f(n-1)是前1,2,.......n-1中最後出佇列的人。
如果m%n==0 第一出來的就是n,還剩餘1.,2.......n-1 則 f(n)=f(n-1)
如果m%n!=0
則m%n+1-------->1
m%n+2-------->2
n----------->n-m%n
1----------->n-m%n+1
2---------->n-m%n+2
....
m%n-1---->n-1
左側為真實值,右側為從新報數的值
看到如果 k=f(n-1)
if(k<=n-m%n) 真實值為f(n)=k+m%n
else 真實值為f(n)=k-(n-m%n)
// 約瑟夫問題.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include using namespace std;
/*author:surpassgood
約瑟夫問題:假設有n個,第一次報數到m的人出列,下個元素從1開始報數
知道所有的人的出列為止
*/#define n 5//n 為總人數
#define m 2//報到m的人出列
int fun(int n)//假設n個人 最後出列的那個人
else
return k-(n-m%n); }}
int _tmain(int argc, _tchar* argv)
node;
void create_link(node * &head,node * &tail,int n)
tail=p;
tail->next=head;
}void look_m(node* &head,node * &tail,int m)
else
} if(cur)
}int _tmain(int argc, _tchar* argv)
附上迴圈鍊錶的**
node * create2(int n)//建迴圈鍊錶
return head;
}void prin(node *head)//列印元素
coutwhile(n--)
}
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫問題
這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...