猴子選大王(3種超簡單的方法)

2021-07-11 16:52:07 字數 1644 閱讀 6305

17個猴子圍成一圈,從某個開始報數1-2-3-1-2-3-……報「3」的猴子就被淘汰,遊戲一直進行到圈內只剩乙隻猴子它就是猴大王了。

方法一:

小技巧:用陣列來記錄猴子是否在圈內的狀態:在圈內記為「1」,不在圈內記為「0」。並以累加陣列元素值來模擬報數過程,這樣就減少了判斷猴子是否在圈內的操作。

c++**如下:

#include 

#include

using

namespace

std;

const

int n = 17;

//列印n只猴子的狀態(「1」表示在圈內,「0」表示不在圈內)

void printvec(const

vector

&v)

cout

v)}

}//最後乙隻猴子下標為1

for (int i=0;iif (1 == v[i])

return i+1;

}}int main()

方法二:

方法一的缺點是每次都要掃瞄包括已出圈的所有猴子,時間效率比較低。而如果用陣列元素來儲存其下乙隻在圈內猴子的下標,就能方便地找到下乙隻在圈內猴子。當乙個猴子的下乙隻猴子就是自己時,圈內就只剩乙隻猴子,它就是候大王了。

c++**:

#include 

#include

using

namespace

std;

const

int n = 17;

int main()

int test = 0;

int last;

while(test != v[test])

updata 2016.07.16

方法3:

在n(0、1、2、3、……、n-1)只猴子中,假定報數m的猴子被刪除,則第一只被刪除的猴子編號為(m-1)%n,記為k,那麼刪除k之後剩下的n-1只猴子為0、1、……、k-1、k+1、……、n-1,並且下一次是從k+1開始計數。相當於在剩下的序列種,k+1排在最前面,從而形成k+1、……、n-1、0、1、……、k-1。接下來將剩下的這n-1個數字的序列k+1、……、n-1、0、1、……、k-1對映形成乙個從0到n-2的序列0、1、2、……、n-2。把對映定義為p,則p(x)=(x-k-1)%n。逆過來0、1、2、……、n-2對映為k+1、……、n-1、0、1、……、k-1,時則p』(x)=(x+k+1)%n,而k=(m-1)%n,故p』(x)=(x+m)%n。最後乙隻猴子的編號為0,故x=0,n=1。例如當m=3時,p』(0)=(0+3)%1=3,表示最後乙隻猴大王在倒數第二輪(編號也是從0開始)中編號為3。

下面給出c++**:

#include 

using

namespace

std;

//n只猴子,報數m的被刪掉

int lastremaining(unsigned

int n, unsigned

int m)

return last+1;//+1為符合習慣,表示將編號變成從1開始

}int main()

7 2 猴子選大王(巨簡單解法)

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

猴子選大王問題(用最簡單的思想)

有 n 只猴子圍成一圈,從 1 n 編號,大家決定從中選出乙個大王。經過協商,決定選大王的規則為 從編號為1的猴子開始報數,報到 k 的猴子出圈,然後再從下乙隻開始繼續報 1 到 k 最後剩下來的那乙隻就是大王。要求程式設計從鍵盤輸入 n k 輸出成為大王的猴子編號。輸入樣例3 2 輸出樣例3 差不...

php猴子選大王問題解決方法

問題描述 一群猴子排成一圈,按1,2,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去.如此不停的進行下去,直到最後只剩下乙隻猴子為止,那只猴子就叫做大王。要求程式設計模擬此過程,輸入m n,輸出最後那個大王的編號。解決方法 i 0 設定陣列指標 ...