約瑟夫問題

2021-06-19 11:34:24 字數 1630 閱讀 9606

如果對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個人為止。問怎樣排法,才能使每次...