《一》問題描述:
有17個人圍成一圈(編號為0~16),從第 0號的人開始從 1報數,
凡報到 3的倍數的人離開圈子,然后再數下去,直到最后只剩下一個人為止。
問此人原來的位置是多少號?
《二》問題解決:
1.定義數組記錄每個編號的狀態(是否被淘汰);
2.在未被淘汰的人中檢查是否數到3,若是,淘汰此人;
3.繼續此過程至所有人被淘汰;
《三》示例代碼:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <math.h> 5 #include <string.h> 6 7 #define N 13 8 9 struct MyStruct 10 { 11 int num; 12 int flag; 13 }; 14 15 typedef struct MyStruct people; 16 17 int main() 18 { 19 20 people a[N]; 21 for (int i = 0; i < N; i++) 22 { 23 a[i].num = i; 24 a[i].flag = 1; 25 } 26 27 for (int i = 0; i < N; i++) 28 { 29 printf("num=%3d,flag=%3d\n", a[i].num, a[i].flag); 30 } 31 32 int count = 0; 33 int i = 0; 34 int index = 0; 35 while (count < N-1) 36 { 37 while (!a[index].flag) 38 { 39 index = (index + 1) % N; 40 } 41 i++; 42 43 if (i % 3 == 0) 44 { 45 a[index].flag = 0; 46 count++; 47 i = 1; 48 } 49 index = (index + 1) % N; 50 51 } 52 53 printf("\n"); 54 i = 0; 55 int flagnum; 56 while (i < N) 57 { 58 if (a[i].flag) 59 { 60 printf("i=%3d,num=%3d,flag=%3d\t該數為所求\n", i, a[i].num, a[i].flag); 61 } 62 else 63 { 64 printf("i=%3d,num=%3d,flag=%3d\n", i, a[i].num, a[i].flag); 65 } 66 i++; 67 } 68 printf("\n"); 69 70 system("pause"); 71 }
