7-28 猴子選大王


7-28 猴子選大王(20 分)

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

輸入格式:

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

輸出格式:

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

輸入樣例:

11

輸出樣例:

思路:用類將猴子在不在圈內的標記和姓名聯系起來,然后進行循環,將報數為3的猴子淘汰,思路清晰了,代碼都不是事

 1 #include<stdio.h>
 2 #include<string>
 3 #include<sstream>
 4 #include<iostream>
 5 using namespace std;
 6 class monkey{        //每只猴子賦有名字和在不在圈中的屬性
 7     public: int name;
 8     public :int flag;
 9 };
10 int main()
11 {
12     int n; cin >> n;
13     monkey *monk = new monkey[1005];
14 
15     for (int i = 1; i <= n; i++)            //給屬性賦值
16     {
17         monk[i].name = i;
18         monk[i].flag = 1;
19     }
20 
21     int rest = n, pos = 1, run = 1;            //rest代表生剩下猴子的數量,pos代表目前指向哪只猴子,run代表這個猴子應該報的數
22     while (rest != 1){
23         if (monk[pos].flag == 1 && run % 3 == 0)            //第三只猴子淘汰
24         {
25             monk[pos].flag = 0;                    //賦值為零時代表淘汰
26             rest--; run = 1;
27         }
28 
29         if (monk[pos].flag == 1)
30         {
31             run++;                                
32         }
33 
34         pos = (pos + 1) % n;
35         if (pos == 0)pos = n;            //循環指向圈中的猴子的名字
36 
37     }
38     for (int i = 1; i <= n; i++)
39     {
40         if (monk[i].flag==1)
41         cout << monk[i].name << endl;
42     }
43     return 0;
44 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM