藍橋杯 猴子選大王 約瑟夫問題

2022-07-03 16:06:15 字數 1275 閱讀 5144

一群猴子要選新猴王。新猴王的選擇方法是:讓n只候選猴子圍成一圈,從某位置起順序編號為1~n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?

輸入格式:

輸入在一行中給乙個正整數n(≤1000)。

輸出格式:

在一行中輸出當選猴王的編號。

輸入樣例:

輸出樣例:

思路一:用陣列模擬乙個環,儲存第下標+1位猴子是否退出(因為下標從0開始),陣列初始化為0,每次輪到數3的猴子就將他的下標置為-1,最後乙個下標不為-1的猴子就是選中的王。

1 #include2

using

namespace

std;34

const

int n = 1000; //

共有n個猴子56

int a[n]; //

用陣列和%操作模擬圈78

int index = 0; //

下標index

9int i = 1; //

用來對3計數

10int counter; //

記錄每次剩下的猴子個數

1112

intmain()

1327

28 i++;

2930

if(i > 3) //

i=4時候,i要回到1

3134}35

36 index++;

3738

if(index >= num) //

當下標達到了猴子總數時,要回到開頭

394243}

4445

for(int i = 0; i < num; i++)

4651}52

53return0;

54 }

思路2:使用遞迴思想

1 #include2

using

namespace

std;34

int fun(intn)5

1011

return (fun(n - 1) + 3) %n;12}

1314

intmain()

15

約瑟夫問題(猴子選大王)

問題描述 約瑟夫問題 有 只猴子,按順時針方向圍成一圈選大王 編號從 到 從第 號開始報數,一直數到 數到 的猴子退出圈外,剩下的猴子再接著從1 開始報數。就這樣,直到圈內只剩下乙隻猴子時,這個猴子就是猴王,程式設計求輸入 後,輸出最後猴王的編號。輸入資料 每行是用空格分開的兩個整數,第乙個是 n,...

猴子選大王 約瑟夫問題

例題描述 由m只猴子圍成一圈,從1到m進行編號,打算從中選出乙個大王,經過協商,決定選出大王的規則 從第乙個開始迴圈報數,數到n的猴子出圈,下乙個猴子從1開始報數。輸入樣例 3 2 輸出樣例 3方法一 模擬法 include using namespace std define max 100 lo...

約瑟夫問題,猴子選大王

描述 約瑟夫問題 有 只猴子,按順時針方向圍成一圈選大王 編號從 到 從第 號開始報數,一直數到 數到 的猴子退出圈外,剩下的猴子再接著從1開始報數。就這樣,直到圈內只剩下乙隻猴子時,這個猴子就是猴王,程式設計求輸入 後,輸出最後猴王的編號。輸入每行是用空格分開的兩個整數,第乙個是 n,第二個是 m...