約瑟夫環問題

2021-05-25 20:26:59 字數 1196 閱讀 1842

約瑟夫問題:設有n個人圍坐在圓桌周圍,現在從某個位置m(1<=m

code:

#include 

#include 

#define bool int

#define true 0

#define false 1

struct link_node ;   

struct link_node *create_list(int n)   

else    

}   

tail->next = head;   

return head;   

}   

bool josephus(struct link_node *plist, int n, int m, int k)   

else  while (p->next != plist);   

p->next = plist->next;   

q = plist;   

plist = plist->next;   

printf("%d ", p->pos);   

free(q);   

} else               

p = plist->next;   

plist->next = p->next;   

printf("%d ", p->pos);   

free(p);   

plist = plist->next;   

}   

}   

}   

return

true;   

}   

int main()     

看別人在網上寫的這個解題的程式,相對而言程式比我的簡單,這裡程式考慮的地方有:

1.由於要建立的是無頭結點的迴圈單鏈表,初始化的時候,頭結點是為空的,如果把20-23**放在迴圈外面,迴圈次數少一即可,這樣程式的迴圈流水線不被打斷,效率應該高些,可我固執的以為建立的過程要在一起。

2.題目要求的是輸出出序序列。假設有3個人,報數要報到10的人出列的話,那多迴圈就轉了很多圈了.所以這裡採用k%n的方式,並根據情況分別處理。

這裡說一下,我剛寫出來的時候在46,47行犯了個毛病,最開始的版本是先設定指標值為空然後才釋放,為這個問題我找了好久,最後才找到了原因。

最後約瑟夫環問題網上還有高效的數學解法,以後再看看。

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫環問題

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