排隊 約瑟夫環

2021-06-25 18:21:56 字數 1103 閱讀 3061

描述

週末了,軟體acm的隊員準備玩玩遊戲,娛樂一下,cy想了乙個好主意,所有隊員站成乙個圈,從1開始報數,凡是報出指定數字的人要出列,有人出列後,下個人重新從1開始報數。最後一位「倖存者」要給大家表演個節目。由於隊員正在不斷的壯大,c小加又想知道他是否需要準備表演,請你設計個程式,幫他確定他是否是「倖存者」。 輸入

第一行是n,有n次遊戲,第二行是m,x,表示某次遊戲有m個人,指定被請出列的數字為x。其中n<100,m<1000

輸出 最後倖存的那位的原來的號碼

方法一、二模擬了整個遊戲過程最後得到結果,費時又費力

方法三:如果將問題更改為:

m個人編號為(0~(m-1)) 從0 報數,報數為(x-1)的人退出,然後繼續; 知道只剩下乙個人;
那麼第乙個退出的人一定是編號為(x%m)-1的,然後剩下m-1個人,以編號為x%m的從0開始報數,這樣就變成了(m-1)個認得子問題;

如果從x%m重新編號

假設s是子問題的解,那麼s'=(s+x)%m;       //(s+x)得到它原來的編號

從而可以用遞推的方式求解

遞推公式為:

f[1]=0;

f[i]=(f[i-1]+x)%i;

用迴圈列表實現:

#include#includetypedef struct nodenode;

int main()

i=1;

p=head;

while(p->next!=p)

p=p->next;

}printf("%d\n",p->num);}}

return 0;

}

用陣列實現:

#include#include#include#define maxn 1000

int a[maxn];

int main(void)

else

count++;

}j++;

}} for(i=0;i

用遞迴實現:

#include #includeint main()

}return 0;

}

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

Josephu 約瑟夫 約瑟夫環 問題

version 2019年08月08日 public class josepfu 建立乙個環形的單向鍊錶 class circlesinglelinkedlist 輔助指標,幫助構建環形鍊錶 boy curboy null for int i 1 i nums i else 遍歷當前的環形鍊錶 pu...