有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來的第幾號的那位。
輸入初始人數n
輸出最後一人的初始編號
樣例輸入
3樣例輸出
2故事背景:
據說著名猶太歷史學家 josephus 有過以下的故事:在羅馬人占領喬塔帕特後,39個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人 開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止,然而 josephus 和他的朋友並不想遵從,josephus 要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。
約瑟夫環(約瑟夫問題)是乙個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0~n-1,最後 [1] 結果+1即為原問題的解。
#include
#include
//約瑟夫環問題,迴圈鍊錶
typedef
struct student
*node,node;
// 定義資料型別,結構體指標node,結構node
node creat
(int n)
;//建立鍊錶函式
void function ( node plist,
int report)
;//處理鍊錶
int main (
)node creat
(int n)
q->next = p_first-
>next;
//尾節點與首節點搭在一起,迴圈鍊錶構造
return p_first;
}void function ( node plist,
int report)
//這個函式實現鍊錶的處理
q=p-
>next;
//此時的q作為記錄需要刪除的節點的位置
p->next = q-
>next;
// q的next節點即需要刪除的位置的下乙個節點,
// 把這個位址值復給p->next,即把p節點刪除
p=p-
>next;
//前面的處理完了之後,移動到這個位置開始報數(從1開始)
free
(q);
//釋放q節點,for 迴圈的下乙個迴圈接著用
}printf
("%d\n"
,p->data)
;free
(p);
//釋放最後只剩下乙個節點的記憶體
}
假設n值為5,**如下(注下圖參考鏈結2) 約瑟夫環的鍊錶解法
約瑟夫環 鍊錶解法 之前遇到乙個面試題,大意是 電梯裡一擁而上一群人,導致電梯超重,於是大家約定,站成一圈,任選一人開始報數,數到3的那個人出電梯,圈內的下乙個人重新從1開始報數,數到3的人再出電梯,一直這樣,直到電梯不超重。現給一串有序的數字,電梯超重需出去m個人,數到k的人出電梯,讓列出出電梯的...
迴圈鍊錶解決約瑟夫環問題
題目要求的約瑟夫環操作 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人只有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...
迴圈鍊錶解決約瑟夫環問題
問題描述 假設有n個小孩按照序號1,2,n圍坐成一圈,從第乙個小孩開始報數,每次報到n的人退出,接著從下乙個人重新開始從1開始報數,下一次再報到n的人退出,求最後乙個留下的人 小孩的個數n,和報數的n由鍵盤輸入 輸出留下人的序號 乙個迴圈鍊錶都寫得除出了很多問題,改了半天才出來 include in...