約瑟夫問題

2021-06-14 15:01:48 字數 3092 閱讀 1969

據說著名猶太歷史學家 josephus有過以下的故事:

在羅馬人占領喬塔帕特後,39個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus和他的朋友並不想遵從,josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

小甲魚:理論為什麼能夠付諸實踐?

熱心魚油:你***在說啥*&(*%@……!

小甲魚:我的意思是約瑟夫問題跟我們講的迴圈鍊錶有啥關係?

某女魚油:它們都帶套!

小甲魚:真聰明,親乙個^_^

小甲魚:對的,約瑟夫問題裡邊41個人是圍成乙個圓圈,我們的迴圈鍊錶也是乙個圓圈,所以可以模擬並讓計算機執行告訴我們結果!

問題:用迴圈鍊錶模擬約瑟夫問題,把41個人自殺的順序編號輸出。

//n個人圍圈報數,報m出列,最後剩下的是幾號?

#include #include typedef struct node

node;

node *create(int n)

s->next = head->next;

} free(head);

return s->next ;

}int main()

printf("%d->", p->next->data );

temp = p->next ; //刪除第m個節點

p->next = temp->next ;

free(temp);

p = p->next ;

} printf("%d\n", p->data );

return 0;

}

另一種實現:

#include "stdafx.h"

#include #include typedef struct node

node;

void initlist(int num,node **phead)

}void printnum(node* phead)

phead=p1;

printf("\n活下來的人:%d,%d\n",phead->m_num,phead->next->m_num);

}int _tmain(int argc, _tchar* argv)

編號為1~n的n個人按順時針方向圍坐一圈,每人持有乙個密碼(正整數,可以自由輸入),開始人選乙個正整數作為報數上限值m,從第乙個人按順時針方向自1開始順序報數,報道m時停止報數。報m的人出列,將他的密碼作為新的m值,從他順時針方向上的下乙個人開始從1報數,如此下去,直至所有人全部出列為止。

#include #include #define max_node_num 100

#define true 1u

#define false 0u

typedef struct nodetype

nodetype;

/* 建立單向迴圈鍊錶 */

static void crealist(nodetype **, const int);

/* 執行"約瑟夫環"問題 */

static void statgame(nodetype **, int);

/* 列印迴圈鍊錶 */

static void prntlist(const nodetype *);

/* 得到乙個結點 */

static nodetype *getnode(const int, const int);

/* 測試鍊錶是否為空, 空為true,非空為false */

static unsigned emptylist(const nodetype *);

int main(void)

else

break;

}crealist(&phead, n);

printf("\n------------ 迴圈鍊錶原始列印 -------------\n");

prntlist(phead);

printf("\n-------------刪除出隊情況列印 -------------\n");

statgame(&phead, m);

}static void crealist(nodetype **pphead, const int n)

else

}printf("完成單向迴圈鍊錶的建立!\n");

}static void statgame(nodetype **pphead, int icipher)

if (pprv == pcur)

iflag = 0;

pdel = pcur; /* 刪除pcur指向的結點,即有人出列 */

pprv->next = pcur->next;

pcur = pcur->next;

icipher = pdel->cipher;

printf("第%d個人出列, 密碼: %d\n", pdel->id, pdel->cipher);

free(pdel);

}*pphead = null;

getchar();

}static void prntlist(const nodetype *phead)

while (pcur != phead);

getchar();

}static nodetype *getnode(const int iid, const int icipher)

pnew->id = iid;

pnew->cipher = icipher;

pnew->next = null;

return pnew;

}static unsigned emptylist(const nodetype *phead)

return false;

}

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...

約瑟夫問題 約瑟夫環

約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...

約瑟夫問題

這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...