已知,有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,輸出猴子離開圈子的順序,從中也可以看出最後為大王是幾號猴子。要求採用陣列作為儲存結構完成。輸入描述 猴子的個數與...