約瑟夫環問題的一種描述是:編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼(正整數)。一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直到所有人全部出列為止。試設計乙個程式求出出列順序。用順序表和煉表結構分別實現。
(1)n=7,7個人的密碼依次為:3,1,7,2,4,8,4,首先m值為6(正確的出列順序應為6,1,4,7,2,3,5)。
(2)n=9,9個人的密碼依次為:4,3,7,1,5,6,3,8,2,首先m值為4
(3)自己任選其它一組測試資料。
順序表結構
主要是用索引%人數m得出真實的位置
#include
#include
#define maxsize 100
typedef
struct cir *list;
struct cir
;void
init
(list &l)
void
(int x, list &l)
l->pw[l-
>last+1]
=x; l-
>isdeq[l-
>last+1]
=0;//出隊全部初始為0
l->last++
;//表長加一
return;}
void
add(
int n, list &l)
intmain()
int m;
printf
("輸入開始第乙個報數值m:");
scanf
("%d"
,&m)
;int index=-1
;printf
("出列順序:");
while
(l->last >=0)
if(m ==1)
m--;}
}free
(l);
return0;
}
執行截圖
鍊錶結構
使用指標遍歷單向迴圈鍊錶,每當報數到m值時,刪除當前指標節點,更改m值為刪除人的密碼,修改指標的為刪除節點的前乙個節點。
#include
#include
typedef
struct lnode *list;
struct lnode
;//建立空鍊錶 只有頭指標
list init()
//新增節點方法
list add
(list &l,
int num)
//尾節點的下一跳指向頭結點下一跳,形成迴圈鍊錶
flag -
>next = head-
>next;
//返回頭結點
return head;
}list deletenode
(list &lbefore,
int&m)
//修改p->q->next 改為 p->next
q = p -
>next;
p->next = q-
>next;
//輸出刪除節點的序號,更改m值為刪除節點的密碼 ,釋放刪除節點
printf
("%d "
,q->num)
; m = q -
>data;
free
(q);
lbefore = p;
//返回刪除節點的前乙個節點
return lbefore;
}game
(list &l,
int m,
int n)
//輸出最後乙個人的密碼
printf
("%d"
,l->num);}
intmain()
執行截圖:
約瑟夫環 陣列與鍊錶實現
約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列.1 陣列實現 void josepharrary int a,int ...
鍊錶實現約瑟夫環
約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依 此規律重複下去,直到圓桌周圍的人全部出列。實現 include using namespace ...
迴圈鍊錶實現約瑟夫環
約瑟夫問題 有n個人圍坐一圈,從第k個人開始數,數到m的那個人出隊。知道最後乙個人出隊。有11個人,從第2個人開始數,數到3的那個人出隊。如下簡圖 這裡有兩個關鍵 1 建立迴圈佇列 不能有頭結點 2 隔m 1步取出該節點 程式如下 include using namespace std typede...