約瑟夫問題:設有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報數,如此下去,直到所有人...