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 }