josephus(約瑟夫)問題

2022-03-19 19:57:00 字數 1131 閱讀 5330

/*

*author:zhangchao

*time:2023年3月31日17:24:11

*from:c語言競賽題目大全第三題

*/#include #include /*

* 有 n 個小孩圍成一圈,給他們從1 開始依次編號,現指定從第 w個開始報數,報到第s 個時,該小

*孩出列,然後從下乙個小孩開始報數,仍是報到 s 個出列,如此重複下去,直到所有的小孩都出列(總

*人數不足 s個時將迴圈報數),求小孩出列的順序。或者是求最後出圈人的編號等等類似問題。

*輸入:第一行輸入小孩的人數 n(n<=64),接下來每行輸入乙個小孩的名字(人名不超過 15 個字元)

*最後一行輸入 w,s (w < n),用逗號","間隔

*輸出:按人名輸出小孩按順序出列的順序,每行輸出乙個人名

*sample input

5xiaoming

xiaohua

xiaowang

zhangsan

lisi

2,3sample output

zhangsan

xiaohua

xiaoming

xiaowang

lisi

*///將data的第p位設定為0

#define clearbit(data,p)\

doint main()

scanf("%d,%d",&w,&s);

//由於w=1意味著從第乙個小孩開始報數,但是我們names陣列是從下標為0開始儲存的,

//所以這裡的w要減1才對。。。

w= w -1;

printf("w=%d,s=%d\n",w,s);

mask = (1ul<< n)-1;//如果有n個小孩,那麼就設定乙個掩碼,有多少個小孩,就有多少個連續為1的位。

//printf("mask=%x\n",mask);

while(mask)

if(count == s)//如果報數達到了預定值s,那麼計數器清零,相應的小孩出列(清除對應掩碼為,列印出列的小孩名字)

w = (w +1)%n;//繼續向後掃瞄。

}system("pause");

return 0;

}

Josephus 約瑟夫 問題

問題描述 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到剩下最後乙個人。程式的意圖是求出最後留下的人的編號。c 實現 include include include u...

約瑟夫(Josephus)問題

一群小孩圍成一圈,任意假定乙個數n,從第乙個小孩起,順時針方向數,每數到第m個小孩時,該小孩便離開。小孩不斷離開,圈子不斷縮小。最後剩下的乙個小孩便是勝者。求勝者的編號?函式名稱 josephus 作 成 者 erick.wang 作成日期 2016 07 19 返 回 值 void 參 數 m,n...

Josephus問題(約瑟夫環)

描述 有n個人坐在一圈做遊戲,給他們編號為1到n,現從1號人開始傳遞乙份烤肉,傳遞m次停下,將拿著烤肉的人從圈中退出,圈縮小,將烤肉給退出的人後面的人,然後開始繼續傳遞m次停下,又將拿著烤肉的人從圈中退出,圈縮小,依次類推,直到剩下乙個人,那個人就可以品嚐烤肉了,作程式,看看最後的獲勝者是誰?分析 ...