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 }

 

posted @ 2018-01-22 15:20  我只有一件白T恤  阅读(1718)  评论(0编辑  收藏  举报