猴子選大王(陣列 鍊錶實現)

2021-10-14 08:29:35 字數 1562 閱讀 8403

已知,有n只猴子,圍繞成一圈,從第1只猴子開始報數1,第2只猴子報數2,以此類推,報數到m時,該猴子退出圈外。從下乙隻猴子開始,重新開始報數,每次報數到m時都會淘汰乙隻猴子,最後剩下的猴子為大王。請問,猴子大王的一開始的序號是多少?

首先這道題乍一看似乎如果用陣列做,陣列的下標會比較難處理,但我們可以略施小計來實現簡化。

先做好初始化

int n,m,i;

//n為猴子總數,m為猴子所報的數

int cnt1=0;

//記錄所報的數

int cnt2=0;

//記錄被淘汰的猴子

int arr[

1000];

cin>>n>>m;

//初始化

for(i=

0;i)

上核心思路

for

(i=0

;i(arr[i]==1

&&cnt1%m==0)

if(cnt2==n-1)

if(i==

(n-1))

}

最後來完整**

#include

using

namespace std;

int arr[

1000];

intmain()

for(i=

0;i(arr[i]==1

&&cnt1%m==0)

if(cnt2==n-1)

if(i==

(n-1))

}for

(i=0

;ireturn0;

}

其實對於大多數已經學過鍊錶的同學來說,鍊錶雖然敲起來

麻煩 ,但是思路還是蠻好確定的。

直接上**(環狀鍊錶)

#include

#include

#include

using

namespace std;

struct monkey

;struct monkey *

create

(int n)

current-

>next=head;

//構建環狀鍊錶

return head;

}struct monkey *del (

struct monkey *head,

int i,

int n)

p->next=q;

//連線

if(n==2)

return q;

//返回

}else

p->next=q-

>next;

if(n==2)

return q-

>next;

//返回刪除處的下乙個 }}

intmain()

cout<>num

}

我們還注意到,這裡其實難點在del函式,要刪除特定位置,並且返回它的下一位為頭指標。

鍊錶 PTA 猴子選大王

一群猴子要選新猴王。新猴王的選擇方法是 讓n只候選猴子圍成一圈,從某位置起順序編號為1 n號。每只猴子預先設定乙個數 或稱定數 用最後乙隻猴子的定數d,從第一只猴子開始報數,報到d的猴子即退出圈子 當某只猴子退出時,就用它的定數決定它後面的第幾隻猴子將在下次退出。如此不斷迴圈,最後剩下的乙隻猴子就選...

鍊錶經典問題 猴子選大王

n 只猴子要選大王,選舉方法如下 所有猴子按1,2 n 編號並按照順序圍成一圈,從第 1個猴子起,由 1開始報數,報到 m時,該猴子就跳出圈外,下乙隻猴子再次由 1開始報數,如此迴圈,直到圈內剩下乙隻猴子時,這只猴子就是大王。include includeusing namespace std ty...

猴子選大王 陣列版

問題描述 一群猴子,編號是1,2,3 m,這群猴子 m個 按照1 m的順序圍 坐一圈。從第1只開始數,每數到第n個,該猴子就要離開此圈,這樣依次下來,最後乙隻出圈的猴子為大王。輸入m和n,輸出猴子離開圈子的順序,從中也可以看出最後為大王是幾號猴子。要求採用陣列作為儲存結構完成。輸入描述 猴子的個數與...