約瑟夫環問題主要分兩種,
第一種問題的描述是:N個人按順時針圍成一個圈,從1到N,然後報數,報到M的人就出去,然後剩餘的人仍然圍成一個圈,從出局的人下一個人開始重新報數,到M的人出局,如此循環。
第二中問題的描述唯一的不同之處就是每個人都會持有一個密碼,這個密碼用來設置M,也就說一個人出局以後,按他所擁有的密碼作爲M來進行淘汰。
第一種問題有兩種解法,第一種就是使用一個循環鏈表,然後按M刪除鏈表中的節點,一直到最後一個節點爲止。第二種解法是數學方法,這個我還是不太明白,沒弄清楚它的原理,這裏有個博客的鏈接地址講這個的.http://blog.csdn.net/lmsnju/archive/2009/11/22/4852020.aspx
第二種問題的解法仍然是循環鏈表,只是在節點結構體當中多存了一個變量用作每個人的密碼。
第一種問題的第一種解法:
第一種問題的第二種解法,這種方法只能求出最後一個出局的人的編號,所以不能像上一種方法一樣把每個人出局的順序都輸出。下面給出這個函數:
第二種問題的解法,實際上跟第一種差不多,只是在結構體裏面加了一個密碼值保存下一次出局的M值,代碼如下: