約瑟夫環(huán)

復習一下關于約瑟夫環(huán)的實現(xiàn)原理:

如果用C來寫的話,也會有許多的方法,比如1:采用鏈表(雙向鏈表)2:遞歸3:隊列(不斷出隊與入隊) 4:非遞歸循環(huán)。

現(xiàn)在簡單介紹一下非遞歸的約瑟夫算法。

首先和媳,需要明白約瑟夫環(huán)的具體規(guī)則:個人(編號0~(n-1)),從0開始報數(shù)哈街,報到(m-1)的退出留瞳,剩下的人繼續(xù)從0開始報數(shù)。求勝利者的編號骚秦。

假設從零開始報她倘,報到m-1的人退出,那么應該報m的人開始報零骤竹,再報到m-1帝牡,該報m的人報零,以此類推蒙揣,當所剩人數(shù)為二的時候靶溜,兩個人依次從0報到m-1,剩下的一個人即是最后的幸存者懒震。而在這兩個人中:

假設m=4罩息,綠色的代表剩存的人,那么在該輪報數(shù)中个扰,其所報的數(shù)則為4%2=0瓷炮;而假設m=5則有

5%2=1,在該輪中這位幸存者所報的最小數(shù)字為1递宅。

之所以按照此方法進行探究的原因為如果n=2娘香,即一共有兩個人苍狰,以m報數(shù),那么幸存者在游戲開始的編號為m%2烘绽。

依次類推淋昭,當n≠2,或者是n為更大的數(shù)時安接,這個幸存的人最開始的編號是多少m=5n=3繼續(xù)作圖

可知在共有三個人時最終幸存者的位置翔忽,本輪的開始到達結束共5人,結束后的第二個才是幸存者盏檐,故幸存者到達該輪的編號0間隔5+1個長度歇式。(5+1)%3=0,可知在該輪(n=3)中胡野,幸存者是編號0的數(shù)材失。

當n=2時,由于下一輪篩選只有一個數(shù)編號零硫豆,所以可以視為0豺憔,故(4+0)%2=0,(5+0)%3=1够庙,符合假設式子。

另抄邀,當m<n時耘眨,對式子進行檢驗,m=3境肾,n=5時剔难,有

(3+0)%4=3??? (3+1)%4=0?? 在有四個人時,綠色的應為編號3奥喻,紅色的應為編號0偶宫,符合事實,在有五個人時环鲤,(3+3)%5=1纯趋,(3+0)%5=3;綠色的為1冷离,紅色的應為3吵冒,符合事實,故解法需要從最后一個開始倒推直到人數(shù)為n時西剥,所求即為正解痹栖。

實現(xiàn)方法可以有:

s=0;a[0]=0;a[1]=0;

for(i=2;i<n;i++)

{s=(s+m)%i;a[i]=s;}

得到在一定的m下,不同總人數(shù)的一系列勝利者的原始編號瞭空。

下面來介紹題目的求解揪阿。

由于題目的要求是前k位留下疗我,后k位淘汰,所以求最終剩余的方法并不方便南捂,從后到前的時間復雜度也會變大吴裤。故使用的方法為逐個淘汰,判斷 淘汰的人是否符合要求黑毅,不符合嚼摩,則改變m。

要達到淘汰的為總人數(shù)的后半段矿瘦,所以第一次考慮m應最小為k+1枕面;

在此基礎上,for語句循環(huán)自增m缚去,判斷合理性潮秘。

合理性的判斷:

x為淘汰的人的原始編號,x=(m+s)%n????? (s初始化為0易结,表示淘汰的人后面一個人被初始化為零后枕荞,該人的前面有幾個編號的人,m+s表示的是下一次需要淘汰的人搞动,由于共有n個人躏精,故需要取模,使淘汰掉的人編號永遠大于k鹦肿,具體k個壞人的排序不需要考慮矗烛,因為是否淘汰的是壞人只需要判斷是否 <k)

如果x<k 代表淘汰掉了好人,循環(huán)退出箩溃,m++瞭吃;

如果x=0;說明淘汰掉的為最后一個人涣旨,設其編號為n歪架,目的是為了避免將x<k的判斷代入,影響結果霹陡。

如果處理后的淘汰人編號符合條件和蚪,則總數(shù)n--;

將淘汰的人的編碼記下穆律,其前面有多少人也記下惠呼。

當n--后與k相等,則說明該m符合條件峦耘,循環(huán)結束剔蹋。

#include<stdio.h>

void main()

{

int a[15];

int x, s, i, k, n, m, tem = 0;

for (i = 1;i < 15;i++)

{

tem = 0;

for (m = i + 1;;m++)

{

if (tem == 1)

break;

s = 0;n = 2 * i;

while (1)

{

x = (s + m) % n;

if (x < 1)

x = n;

if (x <= i)

break;

n--;

s = x - 1;

if (n == i)

{

a[i] = m;

tem = 1;

break;

}}}}

while (scanf("%d", &k)&&(k != 0))

printf("%d\n",a[k]);

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辅髓,隨后出現(xiàn)的幾起案子泣崩,更是在濱河造成了極大的恐慌少梁,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矫付,死亡現(xiàn)場離奇詭異凯沪,居然都是意外死亡,警方通過查閱死者的電腦和手機买优,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門妨马,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杀赢,你說我怎么就攤上這事烘跺。” “怎么了脂崔?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵滤淳,是天一觀的道長。 經(jīng)常有香客問我砌左,道長脖咐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任汇歹,我火速辦了婚禮屁擅,結果婚禮上,老公的妹妹穿的比我還像新娘产弹。我一直安慰自己煤蹭,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布取视。 她就那樣靜靜地躺著,像睡著了一般常挚。 火紅的嫁衣襯著肌膚如雪作谭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天奄毡,我揣著相機與錄音折欠,去河邊找鬼。 笑死吼过,一個胖子當著我的面吹牛锐秦,可吹牛的內容都是我干的。 我是一名探鬼主播盗忱,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼酱床,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了趟佃?” 一聲冷哼從身側響起扇谣,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤昧捷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罐寨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靡挥,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年鸯绿,在試婚紗的時候發(fā)現(xiàn)自己被綠了跋破。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓶蝴,死狀恐怖毒返,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情囊蓝,我是刑警寧澤饿悬,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站聚霜,受9級特大地震影響狡恬,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蝎宇,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一弟劲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姥芥,春花似錦兔乞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至台囱,卻和暖如春淡溯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背簿训。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工咱娶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人强品。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓膘侮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親的榛。 傳聞我的和親對象是個殘疾皇子琼了,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容