7-28 猴子选大王(20 分)
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
思路:用类将猴子在不在圈内的标记和姓名联系起来,然后进行循环,将报数为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 }