約瑟夫環問題

2022-02-14 11:42:52 字數 2086 閱讀 4785

使用者輸入m,n值,從1至n開始順序迴圈數數,每數到m輸出該數值,直至全部輸出。寫出c程式(約瑟夫環問題)

使用者輸入m,n值,從1至n開始順序迴圈數數,每數到m輸出該數值,直至全部輸出。寫出c程式

[cpp]view plain

copy

// 使用者輸入m,n值,從1至n開始順序

// 迴圈數數,每數到m輸出該數值,

// 直至全部輸出

#include 

// 節點

typedef

struct

node  

node;  

// 建立迴圈鍊錶

void

createlist(node*& head, node*& tail, 

intn)  

head = new

node();  

head->data = 1;  

head->next = null;  

node* p = head;  

for(

inti=2; i

tail = p;  

p->next = head;  

}  // 列印迴圈鍊錶

void

print(node*& head)  

if(p)  

}  // 使用者輸入m,n值,從1至n開始順序

// 迴圈數數,每數到m輸出該數值,

// 直至全部輸出

void

countprint(node*& head, node*& tail, 

intm)  

else

}  if

(cur)  

printf("\n"

);  

}  int

main()  

約瑟夫環問題演算法

已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編

號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報

數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全

部出列。

例如:n = 9, k = 1, m = 5

【解答】

出局人的順序為5, 1, 7, 4, 3, 6, 9, 2, 8。

鍊錶方法

這個就是約瑟夫環問題的實際場景,有一種是要通過輸入n,m,k三

個正整數,來求出列的序列。這個問題採用的是典型的迴圈鍊錶的資料

結構,就是將乙個鍊錶的尾元素指標指向隊首元素。 p->link=head

解決問題的核心步驟:

1.建立乙個具有n個鏈結點,無頭結點的迴圈鍊錶

2.確定第1個報數人的位置

3.不斷地從鍊錶中刪除鏈結點,直到鍊錶為空

/*約瑟夫環*/ 

[cpp]view plain

copy

#include   

#include   

typedef

struct

node   

lnode;   

main()   

while

(n <=0);   

do   

while

(k <=0   ||   k> n);   

do   

while

(m <=0);   

p=create(n,k);   

print(p,m);   

return

0;   

};   

lnode*   create(int

n,int

k)/*建立迴圈鍊錶*/

p-> next=l;   

return

t;   

}   

lnode*   getnode(lnode   *p)/*出隊函式*/

print(lnode   *p,int

m)/*輸出函式*/

printf( "%d\n "

,p-> data);   

return

0;   

}   

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫環問題

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