C 陣列 迴圈 遞迴分別處理約瑟夫環

2021-08-13 11:31:14 字數 2010 閱讀 4859

據說著名猶太歷史學家 josephus有過以下的故事:在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從。首先從乙個人開始,越過k-2個人(因為第乙個人已經被越過),並殺掉第k個人。接著,再越過k-1個人,並殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什麼地方才能避免被處決?josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

# define _crt_secure_no_warnings

# include

# include

# include

# include

# include

# define total 41

# define death_num 3

////

////

////

////

////

////

////

////

////

////

////

////

////

//陣列處理約瑟夫問題

int joseph_array(int a,int sum, int death_num, int n)

}i++;

}return i%sum;

}//迴圈處理約瑟夫問題

int joseph_loop(int total,int death_num,int n )

return

index;

}//遞迴處理約瑟夫問題

int joseph_dg(int sum, int value, int n) //sum表示總人數,value表示死亡數字,n要查詢人死亡的順序

else

}/*迴圈處理魔術師發牌問題

total 總的牌數

death_num 是翻牌前要數的數字

n 代表第n張被翻出的牌

index 返回值代表第n張被翻出的牌的下標

*/int magic_card(int total, int death_num, int n)

return

index;

}//開始放牌

void put_card()

; int seq[13];

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

for (i = 0; i < 13; i++)

}

1,定義乙個陣列,初始化全部為0

2,首尾相接迴圈遍歷陣列元素

3,每次取元素時先判斷值是否為死亡數字

4,如果不是就報數,並檢查報出的是否為死亡數字

5,如果是就增加死亡人數

6,當死亡人數到達指定數字時返回剛剛死去的人的下標

7,迴圈遍歷陣列,和迴圈報數,用%搞定

1,每次死去乙個人都構建新環

2,新環中的頭結點相對於舊環有3個單位的偏移

3,每次死去的都是新環中第三個報數的人,下標 = 2%新環總結點 數,之所以要這麼寫時因為新環有可能不足3個人,這樣第三個報數的人的下標就未必是2;

4,加入死去的人的下標是n,那麼在上一環中 下標 = (n + 3) % 上一環總人數 ,依次類推到第一環的時候,就是它在原始環中的下標.

魔術師發牌其實就是在約瑟夫環的運用例項,不同的是死亡數字不是一成不變的,而是遞增的.剩下可以通過約瑟夫環知道13張牌的出場順序,剩下的我們只要按照出場順序依次放上a-k這些牌就可以

約瑟夫環的陣列和鍊錶分別實現

約瑟夫環問題的一種描述是 編號為1,2,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直到所有...

約瑟夫環問題C 遞迴解法

約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0 n 1,最後 1 結果...

C語言使用陣列和迴圈解決約瑟夫環問題

約瑟夫入獄,監獄內共有 33 個犯人。某日 33 名犯人圍成一圈,從第乙個犯人開始報數,報到數字 7 的犯人出列,被槍斃,下一名犯人重新從 1 開始報數。依次類推,直至剩下最後 1 名犯人可被赦免。聰明的約瑟夫在心裡稍加計算,算出了最後槍斃的位置,他站在這個位置,最終避免了自己被槍斃,逃出 問 約瑟...