使用者輸入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報數,如此下去,直到所有人...