當前位置:編程學習大全網 - 編程軟體 - matlab編程:編號,報數,求留

matlab編程:編號,報數,求留

代碼是:

x?=?0;

for?i?=?1:20

x?=?mod(x+5,?i);

end

disp(x+1);

%?將打印?7

如下轉至CSDN - cs_zlg的專欄的博客:

問題提出:

n個人(編號1~n)圍成壹個圈,從1開始依次報數,報到m的出列,剩下的人繼續從1開始報數(由剛出列的人的下壹個人開始)。求最後出列的人(勝利者)的編號。

為了討論方便,先把問題稍微改變壹下,並不影響原意:

問題描述:n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數。求勝利者的編號。

我們知道第壹個人(編號壹定是m%n-1)?出列之後,剩下的n-1個人組成了壹個新的約瑟夫環(以編號為k=m%n的人開始):

k? k+1? k+2? ... n-2, n-1, 0, 1, 2, ... k-2,並且從k開始報0。

現在我們把他們的編號做壹下轉換:

k --> 0

k+1 --> 1

k+2 --> 2

...

k-2 --> n-2

變換後就成為了(n-1)個人報數的子問題,假如這個子問題的解:x是勝利者,那麽根據上表尋找x對應的值,這個值就是n個人時的解。變回去的公式:x'=(x+k)%n=(x+m)%n.

如何知道(n-1)個人報數的問題的解?對,只要知道(n-2)個人的解就行了。(n-2)個人的解呢?當然是先求(n-3)的情況?----?這顯然就是壹個倒推問題。

令f[i]表示i個人玩遊戲報m退出最後勝利者的編號,最後的結果自然是f[n]

遞推公式

f[1]=0;

f[i]=(f[i-1]+m)%i;? (i>1)

有了這個公式,我們要做的就是從1至n順序算出f[i]的數值,最後結果是f[n]。因為實際生活中編號總是從1開始,我們輸出f[n]+1

這個算法的時間復雜度為O(n)。

  • 上一篇:電子商務系統與EDP、MIS、DSS的區別是什麽
  • 下一篇:遊戲開發公司排名
  • copyright 2024編程學習大全網