一群猴子要選新猴王。新猴王的選擇方法是:讓n只候選猴子圍成一圈,從某位置起順序編號為1~n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?
輸入格式:
輸入在一行中給乙個正整數n(≤1000)。
輸出格式:
在一行中輸出當選猴王的編號。
輸入樣例:
輸出樣例:
思路一:用陣列模擬乙個環,儲存第下標+1位猴子是否退出(因為下標從0開始),陣列初始化為0,每次輪到數3的猴子就將他的下標置為-1,最後乙個下標不為-1的猴子就是選中的王。
1 #include2using
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 #include2using
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...