這是一道經典的鍊錶題
josephus有過的故事:39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓。於是決定了自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺。然後下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從,josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。
大致意思
一共有n個人圍坐在一起, 迴圈週期是m, 第乙個人報數1, 第二個人報數2, 當報數到m時, 這個人就會出列。 下乙個人繼續從1開始報數, 整個過程持續到所有人出列為止。 這種問題一般會問最後乙個出列的人是誰, 或者問你某個人是第幾個出列的。。。
對於學習了計算機的我們來說,重複性如此強的過程,當然要交給計算機來幫我們完成吶。所以我們一起來編寫這個程式吧。
建立乙個單向迴圈鍊錶(看題目而定),先建立乙個表頭,在把每個人乙個乙個的尾插進去,然後把頭尾相連。在模擬報數,把要自殺的人乙個乙個刪掉,最後留下來的那個,就是答案。
#include
#include
typedef
struct node node;
node*
creat
(int data)
//建立鍊錶
node*
creatnode
(node* head,
int data)
//插入節點
void
merge
(node* head, node* end)
//首尾相連
void
detele
(node* qian, node* need)
//刪除節點
intmain()
if(i!=
(n-1))
}printf
("%d"
, qian-
>data)
;return0;
}
謝謝**!陣列模擬實現和數學推理法在這裡! 約瑟夫環的問題
約瑟夫環問題 假設有n個人 每當數到m的時候 就將第m個人出列 接下來從m 1個人開始從1數去 每當數到m的時候就出列 第一次出列一定是編號為 m n 1 剩下的人開始形成乙個新的約瑟夫環 從編號為m n開始計數 假設 k m n 則新的約瑟夫環為 k k 1 k 2 k 3 n 2 n 1 n 0...
約瑟夫環的簡單解析
本人也是初涉部落格,會盡量寫的清楚以便大家理解 今天我們就來講解約瑟夫環問題 首先看看題目 約瑟夫問題 輸出最後的編號 description n個人圍成一圈,依次從1至n編號。從編號為1的人開始1至k報數,凡報數為k的人退出圈子,輸出最後留下的乙個人原來的編號。input 首先輸入乙個t,表示有t...
約瑟夫環問題想到的
約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。在思考這個題目時,想到了很多,開始時,是考慮使用直接一遍一遍的遍歷,但...